Android RecyclerView 浅谈

RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓冲.

RecyclerView的优点就是,他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,添加动画效果也非常简单(自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果),也是官方推荐使用的

实现:

在gradle中添加包 

compile 'com.android.support:recyclerview-v7:25.3.1'

  在xml实现布局

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
然后具体上代码了

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_add,btn_delete,btn_list,btn_grid,btn_flow;
    private RecyclerView recyclerView;
    private ArrayList<String> data;
    private MyRecycleViewAdataper adaper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        //设置 RecyclerView适配器
        adaper=new MyRecycleViewAdataper(MainActivity.this,data);
        recyclerView.setAdapter(adaper);
        //LayoutManage
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));//上下文/横纵/倒序否
        recyclerView.scrollToPosition(data.size()-1);//滑到第几行
        //添加分割线
        //recyclerView.addItemDecoration(); 或者 主题中设置 android:listDivider

        //设置某条的监听
        adaper.setOnItemClickListener(new MyRecycleViewAdataper.OnItemClickListener() {
            @Override
            public void onItemClick(View v, String data) {
                Toast.makeText(MainActivity.this, "data="+data, Toast.LENGTH_SHORT).show();
            }
        });
        //设置动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }
    //初始化数据
    private void initData() {
        data=new ArrayList<String>();
        for (int i=0;i<100;i++){
            data.add("content"+i);
        }
    }
    private void initView() {
        btn_add= (Button) findViewById(R.id.btn_add);
        btn_delete= (Button) findViewById(R.id.btn_delete);
        btn_list= (Button) findViewById(R.id.btn_list);
        btn_grid= (Button) findViewById(R.id.btn_grid);
        btn_flow= (Button) findViewById(R.id.btn_flow);
        recyclerView= (RecyclerView) findViewById(R.id.recyclerview);

        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_list.setOnClickListener(this);
        btn_grid.setOnClickListener(this);
        btn_flow.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_add:
                //添加数据
                adaper.addData(0,"new content");
                recyclerView.scrollToPosition(0);
                 break;
            case R.id.btn_delete:
                adaper.deleteData(0);
                //删除数据
                break;
            case R.id.btn_list:
                //List效果
                recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));//上下文/横纵/倒序否
                recyclerView.scrollToPosition(data.size()-1);//滑到第几行
                break;

            case R.id.btn_grid:
                //Grid效果
                recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3,GridLayoutManager.VERTICAL,false));//上下文/3列/横纵/倒序否
                //recyclerView.scrollToPosition(data.size()-1);//滑到第几行
                break;

            case R.id.btn_flow:
                //瀑布流效果
                recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5,StaggeredGridLayoutManager.VERTICAL));//5列/横纵
                //recyclerView.scrollToPosition(data.size()-1);//滑到第几行
                break;
        }
    }
public class MyRecycleViewAdataper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private ArrayList<String> data;
    public static enum ITEM_TYPE{
        ITEM_TYPE_IMAGE,
        ITEM_TYPE_TEXT
    }
    public MyRecycleViewAdataper(Context context, ArrayList<String> data){
        this.context=context;
        this.data=data;
    }
    /**
     * 相当于getView方法中创建View和ViewHold
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(viewType==ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()){
            View itemView=View.inflate(context,R.layout.item_recycleview,null );
            return new MyViewHold(itemView);
        }else{
            View itemView=View.inflate(context,R.layout.item_recycleview2,null );
            return new MyViewHold2(itemView);
        }
    }
    //item的布局分类  和 oncreatViewHolder中的ViewType对应
    @Override
    public int getItemViewType(int position) {
        return position % 2 ==0 ? ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal():ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();//ordina 返回枚举的序数
    }
    /**相当于getView绑定数据的部分代码
     * 数据和View绑定
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof MyViewHold ){
            String datas=data.get(position);
            ((MyViewHold)holder).item_txt.setText(datas);
        }else{
            String datas=data.get(position);
            ((MyViewHold2)holder).item_txt.setText(datas);
        }
    }
    /**
     * 得到总条数
     * @return
     */
    @Override
    public int getItemCount() {
        return data.size();
    }
    //添加数据
    public void addData(int position, String newcontent) {
        data.add(position,newcontent);
        //刷新
        notifyItemInserted(position);
    }
    //删除数据
    public void deleteData(int position) {
        data.remove(position);
        //刷新
        notifyItemRemoved(position);
    }
    //ViewHold
    class MyViewHold extends RecyclerView.ViewHolder{
        private ImageView item_iv;
        public TextView item_txt;
        public MyViewHold(View itemView) {
            super(itemView);
            item_iv= (ImageView) itemView.findViewById(R.id.item_iv);
            item_txt= (TextView) itemView.findViewById(R.id.item_txt);
            //点击整条
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //点击回调到主界面
                    if(null!=onItemClickListener){
                        onItemClickListener.onItemClick(v,data.get(getLayoutPosition()));
                    }
                }
            });
            //点击图片
            item_iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //点击回调到主界面
                    if(null!=onItemClickListener){
                        onItemClickListener.onItemClick(v,data.get(getLayoutPosition()));
                    }
                }
            });
        }
    }
    class MyViewHold2 extends RecyclerView.ViewHolder{
        public TextView item_txt;
        public MyViewHold2(View itemView) {
            super(itemView);
            item_txt= (TextView) itemView.findViewById(R.id.item_txt);
        }
    }
    public interface OnItemClickListener{
         void onItemClick(View v,String data);
    }
    private  OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
}

在转别人一个帖子

http://frank-zhu.github.io/android/2015/01/16/android-recyclerview-part-1/

 



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值