Android最常用控件ListView的升级版之RecylerView

一、前言:RecylerView也是一种类似于ListView的控件,用途基本和ListView一毛一样,但是他相对于ListView来说,会简单一些,而且功能上面更加强大,比如ListView只能将内容竖向排列,而且效率不高,但是RecylerView就可以自己设定其他的排列方式:横向,网格,瀑布等形式。所以说RecylerView是ListView的加强版。不过来笔记中我只写了它的横向排列的实现方法。

二、效果截图:



可以看出来这个真的是十分的简单了。那么直接看看代码吧。

三、实现过程

1. 要使用RecylerView这个控件,首先要在项目的build.grade里面添加依赖库,打开app/build.grade,代码如下

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    //添加RecyclerView依赖库
    compile 'com.android.support:recyclerview-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

2. 在activity_main.xml中添加RecylerView控件

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

3.写一个java类China,他的属性里面包括name和Image就是要显示在RecylerView里的东西

public class China {
    private String name;
    private int image;
    public China(String name,int image){
        this.name = name;
        this.image = image;
    }
    public String getName(){
        return name;
    }
    public int getIcon(){
        return image;
    }
}

4.自定义要显示在RecylerView里面的标签(Item)布局,里面一个ImageView用来显示图片,TextView用来显示文字

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="100dp"
    >
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        />
    <TextView
        android:id="@+id/name"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textSize="20sp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"
        />
</LinearLayout>

5.自定义一个适配器,用来将数据传递布局文件Item中

public class ChinaAdapter extends RecyclerView.Adapter <ChinaAdapter.ViewHolder>{
    private List<China>  mFL;
    static class ViewHolder  extends RecyclerView.ViewHolder{
        View chinaView;
        ImageView  image;
        TextView  name;
        public ViewHolder(View view){
            super(view);
            chinaView = view;
            image = view.findViewById ( R.id.image );
            name  = view.findViewById ( R.id.name );
        }
    }
    public ChinaAdapter(List<China> chinaList){
        mFL = chinaList;
    }

    public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
        View view = LayoutInflater.from (parent.getContext() )
                .inflate ( R.layout.item,parent,false );
        final ViewHolder holder = new ViewHolder ( view );
        //点击事件的监控和处理
        holder.chinaView.setOnClickListener ( new View.OnClickListener (){
            public void onClick(View v){
             int position = holder.getAdapterPosition ();
             China china = mFL.get ( position );
                Toast.makeText ( v.getContext (),"you clicked view "+
                        china.getName (),Toast.LENGTH_SHORT ).show ();
            }
        } );
        return holder;
    }
    public void onBindViewHolder(ViewHolder holder,int i){
        China china = mFL.get ( i );
        holder.image.setImageResource ( china.getIcon () );
        holder.name.setText ( china.getName () );
    }
    public int getItemCount(){
        return mFL.size ();
    }
}

这样大部分的工作就已经做完了,最后在MainActivity文件中将数据加载到RecyclerView中:

6. MainActivity文件:

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRv;
    private List<China> chinaList = new ArrayList<> (  );
    private String[]  data = { "北京","重庆","甘肃","上海", "浙江","江苏"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        initChina ();//初始化数据
        mRv = findViewById ( R.id.mRv );
        //布局设置LinearLayoutManager线性布局、GridLayoutManager网格布局、
        // StaggeredGridLayoutManager瀑布流布局
        LinearLayoutManager layoutManager = new LinearLayoutManager ( this );
        layoutManager.setOrientation ( LinearLayoutManager.HORIZONTAL );
        mRv.setLayoutManager ( layoutManager );
        ChinaAdapter adapter = new ChinaAdapter (chinaList);
        mRv.setAdapter ( adapter );
    }
    private void  initChina(){
        for(int i = 0;i < 2;i++){
            China bj = new China ( data[0],R.mipmap.bj );
            chinaList.add ( bj );
            China cq = new China ( data[1],R.mipmap.cq );
            chinaList.add ( cq );
            China gs = new China ( data[2],R.mipmap.gs );
            chinaList.add ( gs );
            China sh = new China ( data[3],R.mipmap.sh );
            chinaList.add ( sh );
            China zj = new China ( data[4],R.mipmap.zj );
            chinaList.add ( zj );
            China js = new China ( data[5],R.mipmap.js);
            chinaList.add ( js );
        }
    }
}

这样就完成了。

源代码下载



猜你喜欢

转载自blog.csdn.net/sdbx_lyp/article/details/80081569