RecyclerView控件的简单使用例子,包含监听事件的简单处理

1.使用的开发工具:Android Studio 3.1.1,工程目录如下:


2.新建工程,命名为:RecyclerViewTest空工程,导入RecyclerView控件的依赖库:

步骤如下:

打开app/build.gradle,修改后内容如下:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    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'
}
或者也可以通过设置project structure里面的Dependencies点击右上角“+”号输入
com.android.support:recyclerview-v7:27.1.1

进行添加,然后点击file/Sync Project With Gradle Files进行同步,至此,导入依赖包成功!

3.修改activity_main.xml中代码为:

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

这就是我们的手机打开软件后的页面。

然后我们需要定制一个界面控件(即我们需要在软件页面中加入显示的内容),我的设计(一个imageview和一个TextView)如下:


根据设计,我们在layout中添加一个布局文件即fruit_item.xml,代码如下:

<?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="wrap_content">
    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        />

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        />
</LinearLayout>

然后,我们就可以创建我们的适配器(Adapter)了,新建FruitAdapterr类:

package myadapter;

import android.support.annotation.NonNull;
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 com.example.gahui.recyclerviewtest.MainActivity;
import com.example.gahui.recyclerviewtest.R;

import java.util.List;

import UserDefine.Fruit;

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    private List<Fruit> mFruitList;
    public FruitAdapter(List<Fruit> fruitList){
        mFruitList = fruitList;
    }
    static class ViewHolder extends RecyclerView.ViewHolder {//定义一个内部类,viewholder类作为一个缓存器使用,借以提高Recyclerview效率
        View fruitView;    //表示我们自定义的控件的视图
        ImageView fruitImage;
        TextView fruitName;

        public ViewHolder(View itemView) {
            super(itemView);
            fruitView = itemView;
            fruitImage = (ImageView) itemView.findViewById(R.id.fruit_image);
            fruitName = (TextView) itemView.findViewById(R.id.fruit_name);
        }
    }
    @NonNull
    @Override
    public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//创建实例,加载fruit_item布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        final ViewHolder holder = new ViewHolder(view);
        holder.fruitView.setOnClickListener(new View.OnClickListener() {//对加载的子项注册监听事件
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(view.getContext(), "You clicked view " + fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        holder.fruitImage.setOnClickListener(new View.OnClickListener() {//对子项里的Image注册监听事件
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(view.getContext(), "You clicked Image " + fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int position) {//对子项进行赋值
        Fruit fruit = mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
    }

    @Override
    public int getItemCount() {
        return mFruitList.size();
    }


}

这里呢,有一个问题,就是Recyclerview注册监听事件时跟Listview不是一样的操作,并不是在MainActivity中进行,而是由具体的view负责,name我们这个demo中就是由FruitAdapter这个类负责fruit_item的监听事件,所以要在FruitAdapter中进行。

最后修改MainActivity中的内容,实现页面的展示:

package com.example.gahui.recyclerviewtest;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import UserDefine.Fruit;
import myadapter.FruitAdapter;

public class MainActivity extends AppCompatActivity {
    private List<Fruit> fruitList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter adapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(adapter);
    }

    private void initFruits() {
        for(int i=0;i<2;i++){
            Fruit  one = new Fruit("apple", R.mipmap.ic_launcher);
            fruitList.add(one);
            Fruit  two = new Fruit("banana", R.mipmap.ic_launcher);
            fruitList.add(two);
            Fruit  three = new Fruit("grape", R.mipmap.ic_launcher);
            fruitList.add(three);
            Fruit  four = new Fruit("watermelon", R.mipmap.ic_launcher);
            fruitList.add(four);
            Fruit  five = new Fruit("pineapple", R.mipmap.ic_launcher);
            fruitList.add(five);
            Fruit  six = new Fruit("potato", R.mipmap.ic_launcher);
            fruitList.add(six);
            Fruit  seven = new Fruit("cherry", R.mipmap.ic_launcher);
            fruitList.add(seven);
            Fruit  eight = new Fruit("pear", R.mipmap.ic_launcher);
            fruitList.add(eight);
            Fruit  nine = new Fruit("mango", R.mipmap.ic_launcher);
            fruitList.add(nine);
        }
    }
}
虽然一开始是想找一些水果的图片的,但是我偷懒了,直接用了自带的mipmap里的android图标,哈哈,所以要是不偷懒的话自己也可以找对应的图片,只需要把图片文件复制进mipmap文件夹里面就可以了,然后修改
new Fruit("mango", R.mipmap.你的图片的名字);

3.测试结果:

点击点击文字或者点击文字右部空白地方时,比如点击banana或者该栏的空白地方时:


点击android小图片时:


因为只给fruitImage和fruitView设置了监听,所以当点击文字如banana时其实相当于view时,其实执行的方法是holder.fruitView的监听事件,如果你给fruitName设置了监听事件,其实也是可以会有对应的方法的执行的,比如增加一个Toast的显示。

4.拓展,其实RecyclerView的使用还有一个特点,可以横向滚动,而其实RecyclerView默认是纵向排列的,而且这个也很简单,只需要设置fruit_item的属性layout_gravity为“vertical”,宽度layout_width设置为一个固定值,比如说“100dp”,而设置为固定值也只是为了美观,给定一个大小固定的框架。这个就需要读者自己试验了,此处只做一个简单的demo。

5.源代码地址:https://download.csdn.net/download/qq_38442065/10366846

猜你喜欢

转载自blog.csdn.net/qq_38442065/article/details/80040902
今日推荐