数据缓存+listview分页加载+日夜间模式切换

来源:互联网 发布:python 量化交易策略 编辑:程序博客网 时间:2024/06/14 08:56
MainActivity类:
public class MainActivity extends AppCompatActivity {    private ListView lv;    //选择的数据类型    private int type = 1;    //需要几项数据    private int p = 3;   //ListView适配器    private Myadapter adapter;    //夜间模式    private Button btnnight;    //数据库操作    private UserDao userDao;   //定义要加载几项    private int index = 1;    //滑动    private ScrollView scroll;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Themutils.onActivityCreateSetTheme(this);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.lv);        btnnight = (Button) findViewById(R.id.btnnight);        userDao = new UserDao(this);        //listview滑动监听        lv.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {                if (scrollState == SCROLL_STATE_IDLE) {                    if (view.getLastVisiblePosition() == view.getCount() - 1) {                        System.out.println("++++++++++++++++++++++花到最后一个");                        index++;                        getData("http://api.expoon.com/AppNews/getNewsList/type/" + index + "/p/1");                    }                }            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {            }        });        //夜间模式        btnnight.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Themutils.ChangeCurrentTheme(MainActivity.this);            }        });//APP进入就判断网络        if (NetWorkUtils.isConnection(this)) {            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!有网");            getData("http://api.expoon.com/AppNews/getNewsList/type/" + type + "/p/1");        } else {            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!没网");            //如果没网就查询数据库里面的数据            ArrayList<Bean.DataBean> select = userDao.select();            //添加适配器            adapter = new Myadapter(select);            lv.setAdapter(adapter);            //每个item的高度需要重新顶一下            Utility.setListHeight(lv);        }//        for (int i=0;i<10;i++){////////            list.add();//////        }//        lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list));//        Utility.setListHeight(lv);    }    //ListView适配器    private class Myadapter extends BaseAdapter {        private List<Bean.DataBean> data;        private ViewHolder viewholder;        public Myadapter(List<Bean.DataBean> data) {            this.data = data;        }        //查询数据库调用的方法        void loadMore(List<Bean.DataBean> data2) {            for (Bean.DataBean bean : data2) {                data.add(bean);            }        }        //图片缓存类        DisplayImageOptions options = new DisplayImageOptions.Builder()                .cacheOnDisk(true)                .cacheInMemory(true)                .build();        @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) {            //ListView优化            if (convertView == null) {                convertView = convertView.inflate(MainActivity.this, R.layout.activity_youhua, null);                viewholder = new ViewHolder();                viewholder.imageView = (ImageView) convertView.findViewById(R.id.img);                viewholder.textView = (TextView) convertView.findViewById(R.id.tv);                convertView.setTag(viewholder);            } else {                viewholder = (ViewHolder) convertView.getTag();            }            viewholder.textView.setText(data.get(position).getNews_title());            ImageLoader.getInstance().displayImage(data.get(position).getPic_url(), viewholder.imageView, options);            return convertView;        }        class ViewHolder {            TextView textView;            ImageView imageView;        }    }    //使用异步加载数据    private void getData(String path) {        System.out.println("*******************************getData");        new AsyncTask<String, Void, String>() {            @Override            protected void onPostExecute(String s) {                super.onPostExecute(s);                if (s == null)                    return;                // 解析Json                Gson gson = new Gson();                Bean bean = gson.fromJson(s, Bean.class);                List<Bean.DataBean> data = bean.getData();                userDao.add(bean);                //有网络加载数据,没网络加载数据库里面的数据                if (adapter == null) {                    adapter = new Myadapter(data);                    lv.setAdapter(adapter);                    Utility.setListHeight(lv);                } else {                    adapter.loadMore(data);                    adapter.notifyDataSetChanged();                }            }            //使用httpConnection方式在后台加载数据            @Override            protected String doInBackground(String... params) {                System.out.println("*******************************doInBackground");                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) {                        System.out.println("*******************************code");                        InputStream is = connection.getInputStream();                        String json = ReadFile.readfromFile(is);                        System.out.println("===============" + json);                        return json;                    }                } catch (Exception e) {                    e.printStackTrace();                }                return null;            }        }.execute(path);    }}
网络判断类:
public class NetWorkUtils {    /**     * 检查设备网络是否连接     *     * @return     */    public static boolean isConnection(Context context) {        //得到管理网络的服务实例        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        //得到网络信息 (判断网络是否连接、3G、4G)        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();        //判断网络是否已经连接,如果连接的话,返回true,否则false        return (networkInfo != null && networkInfo.isConnected());    }}

图片缓存类:
public class App extends Application {    @Override    public void onCreate() {        super.onCreate();        String path= Environment.getExternalStorageDirectory().getPath()+"/hehe";        File file=new File(path);        ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(this)                .memoryCacheSize(2*1024*1024)                .memoryCacheExtraOptions(400,400)                .threadPoolSize(3)                .threadPriority(100)                .diskCache(new UnlimitedDiskCache(file))                .diskCacheFileCount(50)                .diskCacheFileNameGenerator(new Md5FileNameGenerator())                .diskCacheSize(50*1024*1024)                .build();        ImageLoader.getInstance().init(config);    }}
创建数据库类:
public class SqliteDB extends SQLiteOpenHelper {    public SqliteDB(Context context) {        super(context, "user.db", null, 1);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL("create table ku(news_id Integer,news_summary varchar(300),news_title varchar(300),pic_url varchar(300))");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

滑动页面的算法类:
public class Utility {    public static void setListHeight(ListView listview) {        // 重新计算下Listview的高度        ListAdapter adapter = listview.getAdapter();        if (adapter == null) {            return;        }        // 统计listview的总高度        int totalHeight = 0;        for (int i = 0; i < adapter.getCount(); i++) {            // 拿到一条item视图            View view = adapter.getView(i, null, listview);            // 重新计算一个一条item的宽高            view.measure(0, 0);            // 把这条view的高度加到总高度上            totalHeight += view.getMeasuredHeight();        }        // item的总高度加上间隔线的总高度        totalHeight += listview.getDividerHeight() * (adapter.getCount() - 1);        ViewGroup.LayoutParams params = listview.getLayoutParams();        params.height = totalHeight;        listview.setLayoutParams(params);    }}
夜间模式:
public class Themutils {    private static int theme = 0;    private static final int DAY_THEME = 0;    private static final int NIGHT_THEME = 1;    public static void onActivityCreateSetTheme(Activity activity) {        switch (theme) {            case DAY_THEME:                activity.setTheme(R.style.day_theme);                break;            case NIGHT_THEME:                activity.setTheme(R.style.night_theme);                break;        }    }    public static void ChangeCurrentTheme(Activity activity) {        switch (theme)        {            case DAY_THEME:                theme = NIGHT_THEME;                break;            case NIGHT_THEME:                theme = DAY_THEME;                break;        }        activity.finish();        activity.startActivity(new Intent(activity, activity.getClass()));    }}
配置权限:
<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
android:theme="@style/day_theme"
android:name=".App"