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