一个小项目

案例包括 数据缓存+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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值