博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView使用
阅读量:6280 次
发布时间:2019-06-22

本文共 5494 字,大约阅读时间需要 18 分钟。

  hot3.png

android.support.v7.widget.RecyclerView是v7包里的一个widget,非常强大的一个控件,完全可以代替listview,gridview和瀑布流。

这里主要讲三点:

  1. 为recyclerView设置LayoutManager

  2. RecyclerView.Adapter

  3. 删除和添加数据的动画效果展示

1.

RecyclerView中有三种LayoutManager,如下:

LayoutManager
Orientation
LinearLayoutManager HORIZONTAL、VERTICAL
GridLayoutManager HORIZONTAL、VERTICAL
StaggeredGridLayoutManager HORIZONTAL、VERTICAL

解释一下若设置成 LinearLayoutManager,就和ListView的展示效果基本一样,但人家还可以当作水平方向的listView;若设置GridLayoutManager就相当于girdView,同样可以设置成水平方向滑动;若设置成StaggeredGridLayoutManager,就是瀑布流了,同样可以设置成水平方向滑动。

例如:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);//设置layoutmanagerrecyclerView.setLayoutManager(linearLayoutManager);

2.RecyclerView.Adapter

    这个RecyclerView.Adapter可不得了啊,首先可以带范型,看源码:

public static abstract class Adapter
 {。。。}

然后是个抽象类,举个例子:

public class MyAdapter extends RecyclerView.Adapter
{    @Override    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = View.inflate(parent.getContext(),R.layout.myview,null);        ViewHolder viewHolder = new ViewHolder(view);        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        holder.content.setText(arrayList.get(position));    }    @Override    public int getItemCount() {        return arrayList.size();    }    public class ViewHolder extends RecyclerView.ViewHolder{        private TextView content;        public ViewHolder(View itemView) {            super(itemView);            content = (TextView) ((FrameLayout) itemView).getChildAt(0);        }    }}

这里我自定了一个ViewHolder继承RecyclerView.ViewHolder,说一下MyAdapter的执行流程:首先执行onCreateViewHolder方法,返回了我们自定义的ViewHolder,然后onBindViewHolder方法。可以看出RecyclerView.Adapter对ViewHolder进行了封装。

3.删除和添加数据的动画效果展示,如果是baseAdapter怎么刷新呢,调用notifyDataSetChanged()方法,那在使用RecyclerView时呢:

notifyItemInserted(int position);notifyItemRemoved(int position);

而且还有动画效果。

好了来个例子:

R.layout.activity_recycler_view文件:

    
    

actiivty中:

package com.sumu.gefdemo.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.TextView;import com.sumu.gefdemo.R;import java.util.ArrayList;import java.util.Random;public class RecyclerViewActivity extends AppCompatActivity {    private RecyclerView recyclerView;    private MyAdapter myAdapter;    private ArrayList
 arrayList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_recycler_view);        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);        /**         * 三种LayoutManager         */        //1        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);        //2.        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);        gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);        //3.        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);        //设置layoutmanager        recyclerView.setLayoutManager(staggeredGridLayoutManager);        Random random = new Random();        for (int i = 0;i < 100;i++){            random.nextInt();            arrayList.add(i + "gefufeng" + random.nextInt(10000000));        }        myAdapter = new MyAdapter();        recyclerView.setAdapter(myAdapter);    }    public class MyAdapter extends RecyclerView.Adapter
{        @Override        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            View view = View.inflate(parent.getContext(),R.layout.myview,null);            ViewHolder viewHolder = new ViewHolder(view);            return viewHolder;        }        @Override        public void onBindViewHolder(ViewHolder holder, int position) {            holder.content.setText(arrayList.get(position));        }        @Override        public int getItemCount() {            return arrayList.size();        }        public class ViewHolder extends RecyclerView.ViewHolder{            private TextView content;            public ViewHolder(View itemView) {                super(itemView);                content = (TextView) ((FrameLayout) itemView).getChildAt(0);            }        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        menu.add(0,1,1,"add");        menu.add(Menu.NONE,2,2,"delete");        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        if (item.getItemId() == 1){            arrayList.add(1,"gefufenggefufenggefufenggefufenggefufeng");            myAdapter.notifyItemInserted(1);        }else{            arrayList.remove(2);            myAdapter.notifyItemRemoved(2);        }        return super.onOptionsItemSelected(item);    }}

R.layout.myview文件:

    

效果图(其中之一):

181353_AwGC_2270118.png

转载于:https://my.oschina.net/gef/blog/607017

你可能感兴趣的文章
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>