案例包括 数据缓存+listview分页加载+日夜间模式切换
下面开始贴代码:
MainActivity
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.Image;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import com.example.lixin.dieryhouyhoukao.bean.NewsInfo;
import com.example.lixin.dieryhouyhoukao.util.StreamTools;
import com.example.lixin.dieryhouyhoukao.util.ThemeUtil;
import com.google.gson.Gson;
import com.limxing.xlistview.view.XListView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.w3c.dom.Text;
import org.w3c.dom.ls.LSException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, XListView.IXListViewListener {
private XListView xListView;
private MyBaseAdapter adapter;
private boolean flag;
private UserDao dao;
private ConnectivityBroadcaseReceiver connectivityBroadcaseReceiver;
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置对应的主题 ,在ui创建好之后设置主题无效,所以要放到setContentView()方法前面setTheme()
ThemeUtil.onActivityCreatedSetTheme(this);
setContentView(R.layout.activity_main);
//动态注册广播,创建一个IntentFilter
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
connectivityBroadcaseReceiver = new ConnectivityBroadcaseReceiver();
//注册
registerReceiver(this.connectivityBroadcaseReceiver,filter);
dao = new UserDao(this);
RadioButton radioButton = (RadioButton) findViewById(R.id.night);
radioButton.setOnClickListener(this);
RadioButton radioButton1 = (RadioButton) findViewById(R.id.mulu);
radioButton1.setOnClickListener(this);
getData("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
xListView = (XListView) findViewById(R.id.xlistview);
}
public void getData(String path){
new AsyncTask<String,Void,String>(){
private MyBaseAdapter adapter;
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s!=null){
Gson gson = new Gson();
NewsInfo newsInfo = gson.fromJson(s, NewsInfo.class);
List<NewsInfo.DataBean> data = newsInfo.getData();
if (adapter==null){
adapter = new MyBaseAdapter(data);
xListView.setAdapter(adapter);
for (int i =0;i<data.size();i++){
dao.add(data.get(i).getNews_title(),data.get(i).getPic_url());
}
}else {
adapter.loadMore(data,flag);
adapter.notifyDataSetInvalidated();
}
}
}
@Override
protected String doInBackground(String... params) {
try {
String path = params[0];
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int code = connection.getResponseCode();
if (code == 200){
InputStream is = connection.getInputStream();
String json = StreamTools.readFrom(is);
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(path);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.night:
//切换日夜间模式
ThemeUtil.ChangeCurrentTheme(this);
break;
case R.id.mulu:
ArrayList<NewsInfo.DataBean> dataBeen = dao.find();
break;
}
}
public void getData1(){
ArrayList<NewsInfo.DataBean> data = dao.find();
adapter = new MyBaseAdapter(data);
xListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onRefresh() {
}
@Override
public void onLoadMore() {
getData("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
flag = false;
xListView.stopLoadMore();
}
/**
* 接受网络状态的改变
*/
public class ConnectivityBroadcaseReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//如果能走到这,说明网络已经发生变化
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo !=null && networkInfo.isConnected()){
if (ConnectivityManager.TYPE_WIFI == networkInfo.getType()){
Toast.makeText(context, "这是wife", Toast.LENGTH_SHORT).show();
getData("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
xListView.setPullLoadEnable(true);
xListView.setXListViewListener(MainActivity.this);
}else if (ConnectivityManager.TYPE_MOBILE == networkInfo.getType()){
Toast.makeText(context, "这是移动网络", Toast.LENGTH_SHORT).show();
getData("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
xListView.setPullLoadEnable(true);
xListView.setXListViewListener(MainActivity.this);
}else {
Toast.makeText(context, "网络不可用,请检查网络", Toast.LENGTH_SHORT).show();
getData1();
}
}else {
Toast.makeText(context, "网络不可用,请检查网络", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(connectivityBroadcaseReceiver);
}
class MyBaseAdapter extends BaseAdapter{
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnLoading(R.mipmap.ic_launcher)
.build();
private List<NewsInfo.DataBean> data;
private MyBaseAdapter(List<NewsInfo.DataBean> data){
this.data = data;
}
public void loadMore(List<NewsInfo.DataBean> datas,boolean flag){
//新闻为例,数据要添加到最前面
for (NewsInfo.DataBean bean : datas) {
//flag -> true 添加到卡面 false ->添加到末尾
if(flag) {
}else{
//默认将数据添加到末尾
data.add(bean);
}
}
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null){
convertView = View.inflate(MainActivity.this,R.layout.item,null);
holder = new ViewHolder();
holder.tv = (TextView) convertView.findViewById(R.id.text);
holder.iv = (ImageView) convertView.findViewById(R.id.iv);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(data.get(position).getNews_title());
ImageLoader.getInstance().displayImage(data.get(position).getPic_url(),holder.iv,options);
return convertView;
}
class ViewHolder{
TextView tv;
ImageView iv;
}
}
}
MyApplication
import android.app.Application;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
/**
* Created by hua on 2017/8/12.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(200,200)
.memoryCacheSize(2*1024*1024)
.threadPoolSize(30)
.threadPriority(1000)
.build();
ImageLoader.getInstance().init(configuration);
}
}
Sqlite(创建数据库)
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by hua on 2017/8/12.
*/
public class Sqlite extends SQLiteOpenHelper {
public Sqlite(Context context) {
super(context, "zhoukao.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table zhoukao(_id Integer primary key autoincrement,title varchar(20),url varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
UserDao(进行一些数据库的操作)
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.lixin.dieryhouyhoukao.bean.Data;
import com.example.lixin.dieryhouyhoukao.bean.NewsInfo;
import java.util.ArrayList;
/**
* Created by hua on 2017/8/12.
*/
public class UserDao {
private final SQLiteDatabase db;
public UserDao(Context context){
Sqlite sqlite = new Sqlite(context);
db = sqlite.getWritableDatabase();
}
public void add(String title,String url){
ContentValues values = new ContentValues();
values.put("title",title);
values.put("url",url);
db.insert("zhoukao",null,values);
}
public ArrayList<NewsInfo.DataBean> find(){
NewsInfo.DataBean dataBean = null;
ArrayList<NewsInfo.DataBean> data = null;
try {
Cursor cursor = db.query(false, "zhoukao", null, null, null, null, null, null, null);
data = new ArrayList<>();
while (cursor.moveToNext()){
dataBean = new NewsInfo.DataBean();
String title = cursor.getString(cursor.getColumnIndex("title"));
String url = cursor.getString(cursor.getColumnIndex("url"));
dataBean.setNews_title(title);
dataBean.setPic_url(url);
data.add(dataBean);
}
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
ThemeUtils(判断夜间模式)
import android.app.Activity;
import android.content.Intent;
import com.example.lixin.dieryhouyhoukao.R;
/**
* Created by hua on 2017/8/11.
*/
public class ThemeUtil {
//我当前应用的主题
private static int theme =0;
//日间模式主题
private static final int DAY_THEME = 0;
//夜间模式主题
private static final int NIGHT_THEME = 1;
public static void onActivityCreatedSetTheme(Activity activity){
switch (theme){
case DAY_THEME:
activity.setTheme(R.style.AppTheme);
break;
case NIGHT_THEME:
activity.setTheme(R.style.night_theme);
break;
}
}
//点击按钮改变对应得主题
public static void ChangeCurrentTheme(Activity activity){
//1、改变当前主题的theme变量
switch (theme){
case DAY_THEME:
theme = NIGHT_THEME;
break;
case NIGHT_THEME:
theme = DAY_THEME;
break;
}
//2、重启这个activity
activity.finish();
//加一个动画
activity.overridePendingTransition(R.anim.sliding_in,R.anim.sliding_out);
activity.startActivity(new Intent(activity,activity.getClass()));
}
}
manifest(一些权限)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lixin.dieryhouyhoukao">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".MyApplication"
android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>