下拉刷新 数据库缓存

在MainActivity

public class MainActivity extends BaseActivity implements DrawerLayout.DrawerListener, RadioGroup.OnCheckedChangeListener {

    private DrawerLayout dl;
    private RadioGroup rg;
    private Frag01 frag01;
    private Frag02 frag02;
    private Frag03 frag03;
    private FragmentManager manager;

    @Override
    public int onResID() {
        return R.layout.activity_main;
    }

    @Override
    public void onView() {
        //找控件
        dl = findViewById(R.id.m_dl);
        rg = findViewById(R.id.m_rg);

        dl.addDrawerListener(this);
        rg.setOnCheckedChangeListener(this);
    }

    @Override
    public void onData() {
        //fragment管理者
        manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        //添加fragment
        frag01 = new Frag01();
        frag02 = new Frag02();
        frag03 = new Frag03();
        transaction.add(R.id.m_fl,frag01);
        transaction.add(R.id.m_fl,frag02);
        transaction.add(R.id.m_fl,frag03);
        //默认显示第一个
        transaction.show(frag01).hide(frag02).hide(frag03);
        //开启事物
        transaction.commit();
    }

    @Override
    public void onDrawerSlide(@NonNull View view, float v) {

    }

    @Override
    public void onDrawerOpened(@NonNull View view) {

    }

    @Override
    public void onDrawerClosed(@NonNull View view) {

    }

    @Override
    public void onDrawerStateChanged(int i) {

    }

    //点击判断显示与隐藏页面
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        FragmentTransaction transaction1 = manager.beginTransaction();
        switch (checkedId){
            //显示第一页
            case R.id.m_rb1:
                transaction1.show(frag01).hide(frag02).hide(frag03);
                break;
            //显示第二页
            case R.id.m_rb2:
                transaction1.hide(frag01).show(frag02).hide(frag03);
                break;
            //显示第三页
            case R.id.m_rb3:
                transaction1.hide(frag01).hide(frag02).show(frag03);
                break;
        }
        transaction1.commit();
    }
}

下拉适配器

public class PullToAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<NetBan.DataBean> list;
    private final int TYPE0 = 0;
    private final int TYPE1 = 1;
    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .displayer(new RoundedBitmapDisplayer(20))
            .build();

    public PullToAdapter(Context context, ArrayList<NetBan.DataBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return list.size();
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        if (position % 2 == 0) {
            return TYPE0;
        } else {
            return TYPE1;
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        int type = getItemViewType(position);
        if (convertView == null) {
            switch (type) {
                case TYPE0:
                    viewHolder = new ViewHolder();
                    convertView = View.inflate(context, R.layout.item01, null);
                    viewHolder.textView1 = convertView.findViewById(R.id.i_tv1);
                    viewHolder.imageView1=convertView.findViewById(R.id.i_iv1);
                    convertView.setTag(viewHolder);
                    break;
                case TYPE1:
                    viewHolder = new ViewHolder();
                    convertView = View.inflate(context, R.layout.item02, null);
                    viewHolder.textView2 = convertView.findViewById(R.id.i_tv2);
                    viewHolder.imageView21=convertView.findViewById(R.id.i_iv21);
                    viewHolder.imageView22=convertView.findViewById(R.id.i_iv22);
                    viewHolder.imageView23=convertView.findViewById(R.id.i_iv23);
                    convertView.setTag(viewHolder);
                    break;
            }
        }
        viewHolder = (ViewHolder) convertView.getTag();
        switch (type){
            case TYPE0:
                viewHolder.textView1.setText(list.get(position).getNews_title());
                ImageLoader.getInstance().displayImage(list.get(position).getPic_url(),viewHolder.imageView1,options);
                break;
            case TYPE1:
                viewHolder.textView2.setText(list.get(position).getNews_title());
                ImageLoader.getInstance().displayImage(list.get(position).getPic_url(),viewHolder.imageView21,options);
                ImageLoader.getInstance().displayImage(list.get(position).getPic_url(),viewHolder.imageView22,options);
                ImageLoader.getInstance().displayImage(list.get(position).getPic_url(),viewHolder.imageView23,options);
                break;
        }
        return convertView;
    }

    class ViewHolder {
        TextView textView1;
        TextView textView2;
        ImageView imageView1;
        ImageView imageView21;
        ImageView imageView22;
        ImageView imageView23;
    }
}

//另一个适配器

public class TbAdapter extends FragmentPagerAdapter {
    
    
    private ArrayList<String>list;

    public TbAdapter(FragmentManager fm, ArrayList<String> list) {
        super(fm);
        this.list = list;
    }

    public TbAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        //动态创建Fragment
        Fragments fragments = new Fragments();
        Bundle bundle = new Bundle();
        bundle.putInt("position",i);
        //共享Fragment的下标
        fragments.setArguments(bundle);
        return fragments;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return list.get(position);
    }
}

///Application

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(this).build();
        ImageLoader.getInstance().init(build);
    }
}

基类

public abstract class BaseFragment extends Fragment {

    private boolean isCreateView;
    private boolean isVisibleHint;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(getContext(), onResID(), null);
        onView(view);
        isCreateView = true;
        lazyLoad();
        return view;
    }

    public abstract int onResID();

    public abstract void onView(View view);


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            isVisibleHint = true;
            lazyLoad();
        } else {
            isVisibleHint = false;
        }
    }


    private void lazyLoad() {
        if (isCreateView && isVisibleHint) {
            onData();
            isVisibleHint = false;
            isCreateView = false;
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isVisibleHint = false;
        isCreateView = false;
    }

    public abstract void onData();
}

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(onResID());
        onView();
        onData();
    }

    public abstract int onResID();

    public abstract void onView();

    public abstract void onData();
}

//自己写Bean类
//写Fragment

public class Frag01 extends BaseFragment {

    private TabLayout tl;
    private ViewPager vp;

    @Override
    public int onResID() {
        return R.layout.frag01;
    }

    //找控件
    @Override
    public void onView(View view) {
        tl = view.findViewById(R.id.f_tl);
        vp = view.findViewById(R.id.f_vp);
        //TabLauy集合
        ArrayList<String> tbList = getTbList();
        //动态添加Fragment的适配器
        vp.setAdapter(new TbAdapter(getChildFragmentManager(), tbList));
        //TabLauy与Viewpager关联
        vp.setOffscreenPageLimit(tbList.size());
        tl.setupWithViewPager(vp);
    }

    //返回TabLauy集合
    private ArrayList<String> getTbList() {
        ArrayList<String> tblist = new ArrayList<>();
        tblist.add("推荐");
        tblist.add("热门");
        tblist.add("科技");
        tblist.add("搞笑");
        tblist.add("美女");
        tblist.add("关注");
        tblist.add("热搜");
        return tblist;
    }

    @Override
    public void onData() {

    }


}

public class Frag02 extends BaseFragment {
    @Override
    public int onResID() {
        return R.layout.frag02;
    }

    @Override
    public void onView(View view) {

    }

    @Override
    public void onData() {

    }
}

public class Frag03 extends BaseFragment {
    @Override
    public int onResID() {
        return R.layout.frag01;
    }

    @Override
    public void onView(View view) {

    }

    @Override
    public void onData() {

    }
}
public class Fragments extends BaseFragment {

    private TextView te;

    private Handler handler = new Handler();
    private String path = "http://api.expoon.com/AppNews/getNewsList";
    private int page = 1;
    private ArrayList<NetBan.DataBean> list = null;
    private int type;
    private PullToRefreshListView pl;

    @Override
    public int onResID() {
        return R.layout.fragments;
    }

    //找控件
    @Override
    public void onView(View view) {
        int position = getArguments().getInt("position");
        position = position % 3;
        pl = view.findViewById(R.id.fs_pl);
        //根据type判断这是什么类型
        //显示对应的数据
        type = position + 1;
        //设置上拉下拉
        pl.setPullToRefreshEnabled(true);
        //设置模式
        pl.setMode(PullToRefreshBase.Mode.BOTH);
    }

    @Override
    public void onData() {
        //上拉下拉点击事件
        pl.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            //下拉
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                //判断网络
                boolean netWork = Network.isNetWork(getContext());
                if (netWork) {//有网
                    page = 1;
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getASync(path + "/type/" + type + "/p/" + page);
                            //关闭刷新
                            pl.onRefreshComplete();
                        }
                    }, 2000);
                } else {//没网
                    //提示用户没网
                    Toast.makeText(getActivity(), "请链接网络在次刷新", Toast.LENGTH_SHORT).show();
                    //两秒后关闭刷新
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //关闭刷新
                            pl.onRefreshComplete();
                        }
                    }, 2000);
                }

            }

            //上拉
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                boolean netWork = Network.isNetWork(getContext());
                if (netWork) {//有网
                    page++;
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getASync(path + "/type/" + type + "/p/" + page);
                            //关闭刷新
                            pl.onRefreshComplete();
                        }
                    }, 2000);
                } else {//没网
                    //提示用户没网
                    Toast.makeText(getActivity(), "请链接网络在次加载", Toast.LENGTH_SHORT).show();
                    //两秒后关闭刷新
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //关闭刷新
                            pl.onRefreshComplete();
                        }
                    }, 2000);
                }
            }
        });
        //广播监听网络
        getData();
    }

    //广播监听网络
    public void getData() {
        isNet isNet = new isNet();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        getActivity().registerReceiver(isNet, filter);
    }

    private class isNet extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //判断网络
            boolean netWork = Network.isNetWork(getContext());
            //有网做请求数据
            if (netWork) {
                getASync(path + "/type/" + type + "/p/" + page);
            } else {
                //没网做数据库
                SqlDao sqlDao = new SqlDao(getActivity());
                list = new ArrayList<>();
                Cursor lianxi01 = sqlDao.query("lianxi01", null, null, null, null, null, null);
                //判断有没有第一条
                if (lianxi01.moveToFirst()) {
                    NetBan.DataBean dataBean2 = new NetBan.DataBean();
                    //循环取值
                    do {
                        dataBean2.setNews_title(lianxi01.getString(lianxi01.getColumnIndex("title")));
                        dataBean2.setPic_url(lianxi01.getString(lianxi01.getColumnIndex("image")));
                        list.add(dataBean2);
                    } while (lianxi01.moveToNext());
                } else {
                    return;
                }
                //关闭游标
                lianxi01.close();
                //适配器
                PullToAdapter pullToAdapter = new PullToAdapter(getActivity(), list);
                pl.setAdapter(pullToAdapter);
            }
        }
    }

    private void getASync(String path) {
        MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute(path);
    }

    private class MyAsyncTask extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... strings) {
            return NetConnection.isNetConnection(strings[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //判断返回的字符串是否为空
            if (s == null) {
                return;
            }
            //gson解析
            Gson gson = new Gson();
            NetBan netBan = gson.fromJson(s, NetBan.class);
            //解析后得到的集合
            List<NetBan.DataBean> data = netBan.getData();
            //吧集合添加到一个新的集合做上拉加载用
            if (page == 1) {
                list = new ArrayList<>();
                //吧数据存入集合做无网
                SqlDao sqlDao = new SqlDao(getActivity());
                //每次添加数据库前清空数据
                sqlDao.delete("lianxi01", null, null);
                //循环添加数据库
                for (int i = 0; i < data.size(); i++) {
                    ContentValues values = new ContentValues();
                    values.put("title", data.get(i).getNews_title());
                    values.put("image", data.get(i).getPic_url());
                    sqlDao.add("lianxi01", null, values);
                }
            }
            list.addAll(data);
            //吧新的集合添加到适配器
            PullToAdapter pullToAdapter = new PullToAdapter(getActivity(), list);
            pl.setAdapter(pullToAdapter);
            //定位上拉加载后的位置
            pl.setSelection(pullToAdapter.getCount() - data.size());
        }
    }
}

//写数据库

public class SqlDao {

    private final SQLiteDatabase db;

    //创建有参构造
    public SqlDao(Context context) {
        MySql mySql = new MySql(context);
        //数据库管理
        db = mySql.getWritableDatabase();
    }

    //添加
    public long add(String table, String nullColumnHack, ContentValues values) {
        return db.insert(table, nullColumnHack, values);
    }

    //查询
    public Cursor query(String table, String[] columns, String selection,
                        String[] selectionArgs, String groupBy, String having,
                        String orderBy) {
        return db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
    }
    //删除
   public long delete(String table, String whereClause, String[] whereArgs){
        return db.delete(table, whereClause, whereArgs);
    }
}

public class MySql extends SQLiteOpenHelper {
    public MySql(Context context) {
        //上下文,数据库名,工厂,版本号
        super(context, "bawei.Lianxi", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建表
        db.execSQL("create table lianxi01 (id integer primary key autoincrement,title Text,image Text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

//Utils

public class NetConnection {

    public static String isNetConnection(String path) {
        try {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() == 200) {
                InputStream inputStream = conn.getInputStream();
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = inputStream.read(bytes)) != -1) {
                    stream.write(bytes, 0, len);
                }
                stream.close();
                inputStream.close();
                String data = stream.toString();
                return data;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

public class Network {

    public static boolean isNetWork(Context context) {
        //网络判断
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if(info!=null){
            //有网
            return info.isAvailable();
        }
        //没有网
        return false;
    }
}

//布局
//Mainlayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/m_dl"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <FrameLayout
                android:id="@+id/m_fl"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1">

            </FrameLayout>

            <RadioGroup
                android:id="@+id/m_rg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <RadioButton
                    android:id="@+id/m_rb1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:button="@null"
                    android:gravity="center"
                    android:text="aa"
                    android:textSize="35sp" />

                <RadioButton
                    android:id="@+id/m_rb2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:button="@null"
                    android:gravity="center"
                    android:text="aa"
                    android:textSize="35sp" />

                <RadioButton
                    android:id="@+id/m_rb3"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:button="@null"
                    android:gravity="center"
                    android:text="aa"
                    android:textSize="35sp" />


            </RadioGroup>

        </LinearLayout>

        <FrameLayout
            android:layout_width="300dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@color/colorAccent">

        </FrameLayout>

    </android.support.v4.widget.DrawerLayout>


</LinearLayout>

//frag01

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/colorAccent">

    <EditText
        android:id="@+id/ho_EditText"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:layout_gravity="center"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:background="@drawable/yuanjiao"
        android:cursorVisible="true"
        android:gravity="center_vertical"
        android:hint="搜索"
        android:inputType="text|textMultiLine"
        android:textCursorDrawable="@null"
        android:textSize="20sp" />
</LinearLayout>

<android.support.design.widget.TabLayout
    android:id="@+id/f_tl"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabIndicatorHeight="0dp"
    app:tabMode="scrollable"
    app:tabSelectedTextColor="@color/colorAccent">

</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/f_vp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</android.support.v4.view.ViewPager>
` //frag02
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>

//fragments

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.handmark.pulltorefresh.library.PullToRefreshListView
        android:id="@+id/fs_pl"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>

//item1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/i_tv1"
        android:layout_width="wrap_content"
        android:layout_weight="1"
        android:layout_height="120dp"
        android:text="123"
        android:textSize="25sp" />

    <ImageView
        android:id="@+id/i_iv1"
        android:layout_width="150dp"
        android:layout_height="120dp"
        android:src="@mipmap/ic_launcher"/>


</LinearLayout>

//item2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/i_tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="aa"
        android:textSize="25sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/i_iv21"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_weight="1"
            android:src="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/i_iv22"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_weight="1"
            android:src="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/i_iv23"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_weight="1"
            android:src="@mipmap/ic_launcher" />
    </LinearLayout>


</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值