今天写一个,模仿新闻里的离线下载的一个小功能
先看一下效果
接下来是实现流程
首先是xml布局,RecyclerView需要进行依赖(v7包下的)
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
<RelativeLayout android:layout_width="match_parent" android:layout_height="50dp"> <ImageView android:id="@+id/iv_fan" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginLeft="10dp" android:src="@drawable/ca" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/bt_xiazai" android:layout_alignBottom="@+id/bt_xiazai" android:layout_centerHorizontal="true" android:text="离线下载" /> <Button android:id="@+id/bt_xiazai" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="#00000000" android:text="下载" /> </RelativeLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:textSize="22dp" android:text="我的频道"/> <android.support.v7.widget.RecyclerView android:id="@+id/rlv_item" android:layout_width="match_parent" android:layout_height="match_parent" />
看一下效果
然后是Activity类,代码的书写
public class LiXianctivity extends AppCompatActivity implements View.OnClickListener { private List<Catogray> list; private MySqLiteOpenHelper helper; private Button bt_xiazai; private RecyclerView rlv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_li_xianctivity); initView(); initData(); } /** *初始化控件 */ private void initView() { //实例数据库 helper=new MySqLiteOpenHelper(this); bt_xiazai = (Button) findViewById(R.id.bt_xiazai);//按钮 rlv = (RecyclerView) findViewById(R.id.rlv_item); bt_xiazai.setOnClickListener(this);//点击按钮进行下载页面 } /** *添加数据 */ private void initData() { list = new ArrayList<>(); Catogray bean=new Catogray(); bean.type="top"; bean.name="头条"; list.add(bean); bean=new Catogray(); bean.type="yule"; bean.name="娱乐"; list.add(bean); bean=new Catogray(); bean.type="shehui"; bean.name="社会"; list.add(bean); bean=new Catogray(); bean.type="tiyu"; bean.name="体育"; list.add(bean); //实例适配器 LiXianAdapter adapter=new LiXianAdapter(list,this); //线性布局管理器(让数据进行列表展示) rlv.setLayoutManager(new LinearLayoutManager(this)); rlv.setAdapter(adapter);//设置适配器 //适配器的点击事件(这个是调用的适配器里的回调接口) adapter.setOnItemClickListener(new LiXianAdapter.OnItemClickListener() { @Override public void onItemClickListener(int pos, View view) { //获取控件 CheckBox checkbox = view.findViewById(R.id.checkbox); //Bean类 Catogray c=list.get(pos); //判断checkbox是否选中 if(checkbox.isChecked())//是 { checkbox.setChecked(false);//把checkbox状态改为 false c.state=false; } else { checkbox.setChecked(true); c.state=true; } //修改原有list的数据,根据pos,设置新的对象,然后更新list list.set(pos,c); } }); } /** * 响应点击事件 * 进行离线下载 * @param view */ @Override public void onClick(View view) { Toast.makeText(LiXianctivity.this,"下载",Toast.LENGTH_SHORT).show(); if(list!=null&&list.size()>0) { for (Catogray c:list) { //判断是否是选中状态,如果选中则执行下载操作 if(c.state) { loadData(c.type); System.out.println("====走这里了了="+c.type); } } } //打印,显示 state 状态 for (Catogray catogray:list) { System.out.println("===state==" + catogray.state); } } /** * 根据type进行数据请求下载 * @param type */ private void loadData(final String type) { RequestParams rp=new RequestParams(Api.GET_URL); rp.addParameter("key",Api.KEY); rp.addParameter("type",type); x.http().get(rp,new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { System.out.println("======请求数据成功======"+result); cunchu(type,result); } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } /** * 数据库存储 */ private void cunchu(String type, String result) { SQLiteDatabase sd=helper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("type",type); values.put("result",result); sd.insert("wang",null,values);//表名,null,数据 System.out.println("===数据库存储成功"); } }
接下来是适配器的书写
public class LiXianAdapter extends RecyclerView.Adapter<LiXianAdapter.MyViewHolder>{ private List<Catogray> list;//集合 private Context context;//上下文 private OnItemClickListener onItemClickListener;//接口 //构造器 public LiXianAdapter(List<Catogray> list, Context context) { this.list = list; this.context = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,R.layout.item_rlv,null); MyViewHolder holder=new MyViewHolder(view); //实现自己的回调接口(注意回调接口,哪个场景下使用,就在哪里设置一下,才能起作用) view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemClickListener.onItemClickListener((Integer) view.getTag(),view); } }); return holder; } /** * 这个方法主要用于处理逻辑(绘制ui数据) */ @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.nametv.setText(list.get(position).name); holder.itemView.setTag(position); } @Override public int getItemCount() { return list.size(); } /** * 自己定义的viewholder,继承RecyclerView自带的viewholder,优点是:可扩展,代码简介 */ public static class MyViewHolder extends RecyclerView.ViewHolder { private TextView nametv; private CheckBox checkBox; public MyViewHolder(View itemView) { super(itemView); nametv = itemView.findViewById(R.id.name); checkBox = itemView.findViewById(R.id.checkbox); } } /** * 供调用者调用的接口(所以声明为public) */ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } /** * 条目点击事件接口(recyclerview本身不支持点击事件,必须要自己写) */ public interface OnItemClickListener { void onItemClickListener(int pos,View view); } }
还有一个xml布局
<RelativeLayout android:layout_width="match_parent" android:layout_height="fill_parent" android:padding="15dp"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:text="top"/> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true"/> </RelativeLayout>看一下效果