RecyclerView使用——入门篇

来源:互联网 发布:手机遥控玩具车软件 编辑:程序博客网 时间:2024/06/15 22:03

简述

RecyclerView类似于ListView和GridView,但又因为的可定制性等等优于ListView和GridView,是一个相当强大的控件。所以今天来实现一个简单的RecycleView,如下图所示
示例

XML文件

主要由以下两个xml文件组成
- activity_main.xml:顾名思义是主界面的布局文件
- list_item_layout:这个是RecyclerView中item的布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout   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:layout_height="match_parent"        android:layout_width="match_parent"        android:id="@+id/recyclerView"        android:scrollbars="vertical"        android:scrollbarFadeDuration="1"        /></RelativeLayout>

list_item_layout

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_height="96dp"    android:layout_width="match_parent"    xmlns:fresco="http://schemas.android.com/tools"    android:focusable="true"    android:clickable="true"    android:foreground="?android:attr/selectableItemBackground"    app:cardCornerRadius="4dp"    app:cardElevation="1dp"    app:cardPreventCornerOverlap="true"    android:layout_marginTop="8dp">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="horizontal"        android:paddingLeft="8dp"        android:paddingRight="8dp">        <TextView            android:id="@+id/textViewTitle"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_marginEnd="8dp"            android:layout_marginRight="8dp"            android:layout_weight="1"            android:ellipsize="end"            android:gravity="center_vertical"            android:maxLines="3"            android:paddingBottom="8dp"            android:paddingTop="8dp"            android:textSize="18sp" />        <ImageView            android:id="@+id/image"            android:layout_width="80dp"            android:layout_height="80dp"            android:layout_gravity="center_vertical"            android:src="@drawable/fail"            />    </LinearLayout></android.support.v7.widget.CardView>

这里用CardView,需要添加依赖

compile 'com.android.support:cardview-v7:26.0.0-alpha1'

CardView是一个很实用的东西,可以实现很多效果,这里只讲RecyclerView,所以就不详细介绍了

java文件

主要也是有两个
- MainActivity.java : 主Activity
- MyAdapter.java:自己定制所需的适配器

先从MyAdapter介绍:

  • 首先要定义一个MyHolder,我把它理解成一个item的容器,里面把每个item中的组件先初始化
     / **     * 自定义Holder     */    public class MyHolder extends RecyclerView.ViewHolder implements RecyclerView.OnClickListener{        ImageView imageView;        TextView title;        public MyHolder(View itemView) {            super(itemView);            imageView = (ImageView) itemView.findViewById(R.id.image);            title = (TextView) itemView.findViewById(R.id.textViewTitle);            itemView.setOnClickListener(this);        }        @Override        public void onClick(View v) {        }    }
  • 第二步将建立的MyAdapter继承RecyclerView.Adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>
  • 最后在onBindViewHolder(MyHolder holder, final int position) 方法中实现自己想要显示的内容,以及OnClick事件,如:
@Override    public void onBindViewHolder(MyHolder holder, final int position) {        holder.title.setText(list.get(position));       // holder.imageView.setImageDrawable(R.drawable.test_image);        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(context,list.get(position)+"被点击",Toast.LENGTH_LONG).show();            }        });    }

完整MyAdapter.java

package com.recyclerviewtest;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;/** * Created by asus on 2017/3/21. */public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {    private ArrayList<String> list;    private final Context context;    private final LayoutInflater inflater;    public MyAdapter(Context context, ArrayList<String> list){        this.context = context;        this.list = list;        inflater = LayoutInflater.from(context);    }    /**     * 创建Holder     * @param parent     * @param viewType     * @return     */    @Override    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view  = inflater.inflate(R.layout.list_item_layout,parent,false);        return new MyHolder(view);    }    @Override    public void onBindViewHolder(MyHolder holder, final int position) {        holder.title.setText(list.get(position));       // holder.imageView.setImageDrawable(R.drawable.test_image);        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(context,list.get(position)+"被点击",Toast.LENGTH_LONG).show();            }        });    }    @Override    public int getItemCount() {        return list.size();    }    /**     * 自定义Holder     */    public class MyHolder extends RecyclerView.ViewHolder implements RecyclerView.OnClickListener{        ImageView imageView;        TextView title;        public MyHolder(View itemView) {            super(itemView);            imageView = (ImageView) itemView.findViewById(R.id.image);            title = (TextView) itemView.findViewById(R.id.textViewTitle);            itemView.setOnClickListener(this);        }        @Override        public void onClick(View v) {        }    }}

MainActivity里面的操作

  • 设置布局管理器
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  • 设置Adapter
mRecyclerView.setAdapter(myAdapter);

完整MainActivity.java

package com.recyclerviewtest;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.ArrayList;public class MainActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private MyAdapter myAdapter;    private ArrayList<String> list = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //设置布局管理器        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        for(int i =0;i<20;i++){            list.add("这是标题"+i);        }        myAdapter = new MyAdapter(this,list);        //设置Adapter        mRecyclerView.setAdapter(myAdapter);    }}

最后说一句

这里就先简单实现一下RecyclerView的用法,与ListView非常相像,接下来将会更新如果在RecyclerView中如何加入头布局,例如加上一个图像浏览的ViewPager,还有瀑布流布局。