RecyclerView的基本用法

来源:互联网 发布:服务器地址、远程端口 编辑:程序博客网 时间:2024/05/21 17:37

以下内容来自《第一行代码Android》的学习笔记

由于RecyclerView是后来增加的控件,因此需要在build.gradle中引用其对象。

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:appcompat-v7:25.3.0'    compile 'com.android.support:recyclerview-v7:25.3.0'    testCompile 'junit:junit:4.12'
注意com.android.support:recyclerview-v7:25.3.0一定要与上面的对应.低于 该版本会提示不是最新版本而报错,高于则会报合并错误。

然后定义一个自定义的Item control group 是布局的xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="horizontal">    <ImageView        android:id="@+id/fruit_img"        android:layout_width="100dp"        android:layout_height="100dp"/>    <TextView        android:id="@+id/fruit_txt"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        /></LinearLayout>
接下来需要自定义一个填充器。并且注意在填充器中声明了一个静态类。这个ViewHolder处理自定义的数据。

package Adapter;import android.support.annotation.NonNull;import android.support.v7.widget.RecyclerView;import android.view.*;import android.widget.*;import com.example.uiwidgettest.R;import java.util.*;import model.Fruit;/** * Created by dypeng on 2017/4/16. */public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {    List<Fruit> fruitData ;    /**     * 构造函数如何使用...............................     * @param data     */    public FruitAdapter(List<Fruit>  data){        fruitData=data;    }    /**     * 第二步:在生成超类ViewHolder的时候,引用指定的布局,并生成自定义的ViewHolder     * @param parent     * @param viewType     * @return     */    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);        ViewHolder vh = new ViewHolder(view);        return vh;    }    /**     * 第三步:当绑定ViewHolder数据的时候,设置自定义ViewHolder的属性值.     * @param holder     * @param position     */    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        Fruit fruit = fruitData.get(position);        holder.Img.setImageResource(fruit.getImgid());        holder.fruitName.setText(fruit.getFruitName());    }    @Override    public int getItemCount() {        return fruitData.size();    }    /**     * 第一步:重新定义一个静态的ViewHolder类,目的是将自定义的控件包括进去,为绑定其数据作准备     * */    static class ViewHolder extends RecyclerView.ViewHolder{        private ImageView Img;        private TextView fruitName;        public ViewHolder(View itemView) {            super(itemView);            Img=(ImageView)itemView.findViewById(R.id.fruit_img);            fruitName=(TextView)itemView.findViewById(R.id.fruit_txt);        }    }}

再定义一个活动的布局。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/activity_list"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"><android.support.v7.widget.RecyclerView    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/recyclerView"/></LinearLayout>


然后在活动中就可以引用了。

package com.example.uiwidgettest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import java.util.*;public class ListActivity extends BaseActivity {    List<model.Fruit> FruitList=new  ArrayList<model.Fruit>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_list);        InitialFruit();        Adapter.FruitAdapter adapter=new Adapter.FruitAdapter(FruitList);        RecyclerView rview=(RecyclerView)findViewById(R.id.recyclerView);        LinearLayoutManager layoutManager = new LinearLayoutManager(this);        //layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);横向布局去掉该注释。并且需要在布局文件中作相应的设置。需要把item_layout(细项中的布局)android:orientation="horizontal"换成 android:orientation="vertical"        rview.setLayoutManager(layoutManager);        rview.setAdapter(adapter);    }    private void InitialFruit(){        for (int i=0;i<30;i++){            model.Fruit f1=new  model.Fruit(R.drawable.apple,"苹果");            model.Fruit f2=new  model.Fruit(R.drawable.orange,"橙");            model.Fruit f3=new  model.Fruit(R.drawable.pear,"梨");            FruitList.add(f1);            FruitList.add(f2);            FruitList.add(f3);        }    }}

如果需要定义单击事件,是直接在Item的控件中订单事件侦听的。如以下定义一个图片的单击事件。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);        final ViewHolder vh = new ViewHolder(view);        vh.Img.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int position=vh.getAdapterPosition();                Fruit f=fruitData.get(position);                Toast.makeText(v.getContext(),f.getFruitName(),Toast.LENGTH_LONG).show();            }        });        return vh;    }








0 0