Android离线下载的实现

本文介绍了一个简单的离线下载功能实现过程,包括XML布局配置、Activity类代码编写及RecyclerView适配器的定制。通过实例展示了如何创建离线下载界面,并实现了频道选择与下载功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写一个,模仿新闻里的离线下载的一个小功能


先看一下效果


接下来是实现流程

首先是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>
看一下效果






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值