Android RecyclerView的使用学习

最近在学习5.0控件RecyclerView的使用,虽然在功能上比ListView要强大很多,特别是动效上的,但在代码上就要比ListView多些了,在这里备下份,也许以后用得到。

首先是RecyclerView也有一个自己的Adapter,但不是基于BaseAdapter,是RecyclerView.Adapter,RecyclerView一定要使用ViewHolder,而不像ListView那样可以不使用。

下面是Demo:

package com.example.recycleview.adapter;

import com.example.recycleview.R;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

class DemoViewHolder extends RecyclerView.ViewHolder {
    private String data;
    private TextView contentTV;
    public DemoViewHolder(View itemView, int position) {
        super(itemView);
        contentTV = (TextView) itemView.findViewById(R.id.content_tv);
    }

    public void setData(String data) {
        if(this.data != data) {
            this.data = data;
        }
        contentTV.setText(this.data);
    }
    
}

这是一个简单的ViewHolder,接下来是Adapter

package com.example.recycleview.adapter;

import java.util.List;
import com.example.recycleview.R;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;

public class DemoAdapter extends RecyclerView.Adapter<DemoViewHolder>{
    private List<String> datas;
    private Context mContext;
    public DemoAdapter(Context context) {
        super();
        mContext = context;
    }
    
    public void setDatas(List<String> datas) {
        if(this.datas != datas) {
            this.datas = datas;
        }
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    @Override
    public void onBindViewHolder(final DemoViewHolder viewHolder, final int position) {
        viewHolder.setData(datas.get(position));
        viewHolder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取当前的positon,如果有更新改变后的position,可以不用
//                int pos = viewHolder.getLayoutPosition();
                Toast.makeText(mContext, position + "", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public DemoViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.demo_recycleview_item, viewGroup, false);
        return new DemoViewHolder(v, position);
    }
    
    /**
     * @param position
     */
    public void addData(int position) {
        datas.add(position, "Insert One");
        notifyItemInserted(position);
        //增加,删除数据后需要提示其它位置的position变化,不然还是以前的position
        notifyItemRangeChanged(position, datas.size());
    }


    public void removeData(int position) {
        datas.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, datas.size());
    }
}

在这里要特别强调下 notifyItemRangeChanged(position, datas.size());的使用,只有这样才可以让修改的数据通知后面的item,不然就只有通过viewHolder.getLayoutPosition();来获取当前最新的位置了。

接下来说下如何使用

    demoAdapter.setDatas(datas);
        demoStaggeredAdapter = new DemoStaggeredAdapter(this);
        demoStaggeredAdapter.setDatas(datas);
        recyclerView.setAdapter(demoAdapter);
        dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
        dividerGridItemDecoration = new DividerGridItemDecoration(this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayout.VERTICAL, false));
        recyclerView.setItemAnimator(new DefaultItemAnimator());//设置动效
        recyclerView.addItemDecoration(dividerItemDecoration);//设置分隔线
        //分隔线另一个库代码设置
//        recyclerView
//                .addItemDecoration(new HorizontalDividerItemDecoration.Builder(
//                        this)
//                        .color(Color.RED)
//                        .size(getResources().getDimensionPixelSize(
//                                R.dimen.divider))
//                        .margin(getResources().getDimensionPixelSize(
//                                R.dimen.leftmargin),
//                                getResources().getDimensionPixelSize(
//                                        R.dimen.rightmargin)).build());

分隔线比较麻烦,但可以从git上找些下来用,这个就比listview比较麻烦先。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值