RecyclerView的简单使用

以前都是用的listView,但是v7包提供了一个比listView更好用的,具有listView所有功能的组件,那就是recyclerview,它设置布局的时候,不仅有线性布局(listview的布局),还有表格布局,以及瀑布流布局,而且每种布局都可以设置成横向或者纵向,功能简直强大。它除了布局设置,还有分隔线设置,以及添加,删除的动画设置,不过这些只是提供了一种默认的可以使用,一般情况需要自定义。它的适配器比listView的要简单。但是它没有提供item的点击和长按事件,这里需要自己设置回调事件。虽然他没有点击和长按事件不过它的viewholder加载的view有点击和长按事件,设置回调事件,得从这里入手。

使用RecyclerView要导入v7的依赖包虽然Android studio新建项目就会导入v7的appcompat依赖,不过里面并没有这个组件,这个组件要单独导入依赖。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

直接上代码,代码里有说明

item的布局,就是一个imagview和textview,而Data则是与它对应的一个设置图片的int,与一个设置文字的string代码就不贴了。只贴适配器和主活动代码

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

    public LinkedList<Data> datas;
    public Context context;

    public MyAdapter(LinkedList<Data> datas,Context context){
        this.context=context;
        this.datas=datas;
    }

    public void add(Data data){
        if(datas==null)
            datas=new LinkedList<Data>();
        datas.add(data);

        //如果使用notifyDataSetChanged()则没有添加的动画效果
        //notifyDataSetChanged();
        notifyItemInserted(datas.size()-1);
    }
    public void remove(int position){
        if(datas!=null){
            datas.remove(position);

            //如果使用notifyDataSetChanged()则没有移除的动画效果
            //notifyDataSetChanged();
            notifyItemRemoved(position);
        }
    }
    public void modify(Data data,int position){
        datas.set(position,data);
        notifyDataSetChanged();
    }

    //事件监听的回调接口
    public interface OnItemClickListener{
        void onItemClick(View view,int postion);
        void onItemLongClick(View view,int postion);
    }
    private OnItemClickListener mlistener;
    public void setOnItemClickListener(OnItemClickListener mlistener){
        this.mlistener=mlistener;
    }

    @Override
    public  ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //加载布局创建viewholder
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycle,parent,false);
        ViewHolder viewHoder=new ViewHolder(view);
        return viewHoder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        //为viewholder绑定数据
        holder.imageView.setImageResource(datas.get(position).imgid);
        holder.textView.setText(datas.get(position).text);

        if(mlistener!=null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos=holder.getLayoutPosition();
                    mlistener.onItemClick(holder.itemView,pos);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos=holder.getLayoutPosition();
                    mlistener.onItemLongClick(holder.itemView,pos);
                    return true;
                }
            });
        }
    }


    @Override
    public int getItemCount() {
        return datas==null ? 0:datas.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{

        ImageView imageView;
        TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
            imageView= (ImageView) itemView.findViewById(R.id.img);
            textView= (TextView) itemView.findViewById(R.id.text);
        }
    }
}
public class MainActivity extends AppCompatActivity {

    private MyAdapter myAdapter;
    private LinkedList<Data> datas;
    private RecyclerView recyclerView;

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button= (Button) findViewById(R.id.button);

        initrecycler();
        listen();
    }

    public void initrecycler(){
        recyclerView= (RecyclerView) findViewById(R.id.recycle);
        datas=new LinkedList<Data>();
        for(int i=0;i<10;i++){
            datas.add(new Data(R.mipmap.ic_launcher,"item "+i));
        }
        myAdapter=new MyAdapter(datas,MainActivity.this);
        //设置布局为线性布局,默认竖直
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

//        //设置布局为横向的线性布局,false表示方向向右。
//        recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));

//        //设置布局为网格3列布局,默认竖直
//        recyclerView.setLayoutManager(new GridLayoutManager(this,3));

//        //设置布局为3列的瀑布流布局。
//        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

        recyclerView.setAdapter(myAdapter);
        //设置添加和删除的动画效果
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置横向分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(MainActivity.this, LinearLayoutManager.VERTICAL));
    }

    public void listen(){
        //RecyclerView没有点击和长按事件监听,所以自己设置回调事件
        myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int postion) {
                Toast.makeText(MainActivity.this,"点击"+postion,Toast.LENGTH_SHORT).show();
                myAdapter.add(new Data(R.mipmap.ic_launcher,"新来的"));
            }

            @Override
            public void onItemLongClick(View view, int postion) {
                Toast.makeText(MainActivity.this,"长按"+postion,Toast.LENGTH_SHORT).show();
                myAdapter.remove(postion);
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                myAdapter.modify(new Data(R.mipmap.ic_launcher,"修改的"),0);
            }
        });
    }
}

这样的话点击或者长按,每个item没有背景颜色变化,不像listView那样变成灰色。解决办法很简单,给每个item布局里面设置一个selector背景就OK了,不清楚selector背景用法的读者自行百度下。
适配器类里面除了一个事件回调接口,还有继承的类要传一个自己的viewholder进去,其他的跟listView的适配器大同小异,就不做太多说明,

RecycleView是一种在Android中常用的列表控件,它允许你在列表中显示大量数据,而不会导致应用程序变得卡顿或崩溃。它使用了一个称为“回收利用”的概念,这意味着当列表不再需要时,它可以将某些元素从内存中释放出来,以节省内存空间。 以下是使用RecycleView的一些基本步骤: 1. 添加依赖项:首先,你需要在你的项目中添加一个recyclerView依赖项。如果你使用的是Gradle构建系统,可以在build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' // 使用最新版本 } ``` 2. 创建布局文件:在你的布局文件中创建一个新的recyclerView布局文件。这个文件应该包含一个或多个用于显示数据的视图。 3. 创建适配器:适配器是连接recyclerView和数据源的关键组件。你需要创建一个适配器类,该类继承自RecyclerView.Adapter,并实现其中的一些接口方法。 4. 绑定适配器:最后,你需要将适配器绑定到recyclerView上。这通常在Activity或Fragment的onCreate方法中完成。你可以使用setAdapter方法将适配器绑定到recyclerView上。 以下是一个简单的示例代码,演示如何使用RecycleView: 1. 在布局文件中添加一个recyclerView: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在Activity或Fragment中创建一个RecyclerViewAdapter: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> data; // 数据源 public MyAdapter(List<String> data) { this.data = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { private TextView textView; // 自定义视图组件 public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); // 获取自定义视图组件并设置文本 } } } ``` 3. 在Activity或Fragment的onCreate方法中绑定适配器: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(myData); // myData是数据源,例如一个List<String>对象 recyclerView.setAdapter(adapter); // 将适配器绑定到recyclerView上 ``` 这就是使用RecycleView的基本步骤。你可以根据需要自定义布局和适配器,以适应你的应用程序需求。RecycleView提供了许多高级功能,如自动布局、可点击边距等,可以根据需要进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值