在很早之前,
RecyclerView
还没出来的时候,列表组件基本都使用ListView,ListView本身不会自带复用机制,想要实现复用都是程序猿使用代码控制实现的,随着Recyclerview
的出现,项目中很少使用ListView了,因为Recyclerview
自带复用机制。
(1)添加权限
RecyclerView
本身并不需要添加权限,但是大部分列表组件都含有图片,如果是网络路片,那么需要添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
如果图片需要缓存(三方图片加载库基本都自带图片缓存机制),那么还需要文件存储权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果加载本地缓存的图片,那么还需要读取文件的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
(2)添加依赖
//RecyclerView依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
//AndroidX对应的RecyclerView依赖
//implementation 'androidx.recyclerview:recyclerview:1.0.0'
//glide依赖,加载图片使用
implementation 'com.github.bumptech.glide:glide:4.9.0'
注意:Recyclerview本身和Glide框架无关,只是本例中图片的展示需要Glide加载。
(3)代码部分
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
recycleview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="20dp">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="40dp"
android:paddingBottom="5dp"
android:layout_gravity="center_horizontal" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_gravity="center_horizontal"
android:textSize="18sp"
android:text=""
android:gravity="center_horizontal"
android:textColor="@color/colorAccent"
android:visibility="visible" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:padding="10dp">
<Button
android:id="@+id/button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1"/>
<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:text="按钮2"/>
</LinearLayout>
</LinearLayout>
PhotoBean.java
public class PhotoBean {
private String url;
private String name;
public PhotoBean(String url, String name) {
this.url = url;
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
RecycleViewAdapter.java
public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<PhotoBean> mData;
private Context mContext;
private OnItemClickLitener mOnItemClickLitener;
public RecycleViewAdapter(Context context, List<PhotoBean> mData) {
this.mContext = context;
this.mData = mData;
}
@Override
public int getItemViewType(int position) {
//如果返回position,就会失去RecyclerView特有复用机制
return position;
}
/**
* 设置数据
* @param mData
*/
public void setDatas(List<PhotoBean> mData){
this.mData = mData;
}
@Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
PhotoBean dataListBean = mData.get(position);
if(dataListBean != null){
Glide.with(mContext).load(dataListBean.getUrl()).into(((ViewHolder)holder).imgView);
((ViewHolder)holder).tvName.setText(dataListBean.getName());
}
((ViewHolder)holder).imgView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickLitener != null) {
if(mData != null && mData.size() > 0){
mOnItemClickLitener.onItemClick(((ViewHolder)holder).imgView, position);
}
}
}
});
((ViewHolder)holder).button_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickLitener != null) {
if(mData != null && mData.size() > 0){
mOnItemClickLitener.onItemClick(((ViewHolder)holder).button_1, position);
}
}
}
});
((ViewHolder)holder).button_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickLitener != null) {
if(mData != null && mData.size() > 0){
mOnItemClickLitener.onItemClick(((ViewHolder)holder).button_2, position);
}
}
}
});
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.recycleview_item, parent, false);
ViewHolder holder = new ViewHolder(itemView);
return holder;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView imgView;
TextView tvName;
Button button_1, button_2;
public ViewHolder(View itemView) {
super(itemView);
imgView = itemView.findViewById(R.id.image);
tvName = itemView.findViewById(R.id.text);
button_1 = itemView.findViewById(R.id.button_1);
button_2 = itemView.findViewById(R.id.button_2);
}
}
public interface OnItemClickLitener {
void onItemClick(View view, int position);
}
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
this.mOnItemClickLitener = mOnItemClickLitener;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecycleViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
//mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 2));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setHasFixedSize(false);
List<PhotoBean> list = new ArrayList<>();
list.add(new PhotoBean("https://img.52z.com/upload/news/image/20180621/20180621055734_59936.jpg", "1"));
list.add(new PhotoBean("http://pic4.nipic.com/20090910/3218971_153314069210_2.jpg", "2"));
list.add(new PhotoBean("https://img.pc841.com/2018/0922/20180922111049508.jpg", "3"));
list.add(new PhotoBean("https://b-ssl.duitang.com/uploads/item/201607/20/20160720161857_NcJZE.jpeg", "4"));
list.add(new PhotoBean("http://pic31.nipic.com/20130629/110640_043033294000_2.jpg", "5"));
list.add(new PhotoBean("http://gz.people.com.cn/mediafile/201110/12/F201110121632371556600701.jpg", "6"));
list.add(new PhotoBean("http://pic39.nipic.com/20140315/2531170_191053321000_2.jpg", "7"));
list.add(new PhotoBean("http://ftp.gongkong.com/UploadPic/Forum/2010-10/2010100822163800001.jpg", "8"));
list.add(new PhotoBean("http://pic19.nipic.com/20120326/3403052_123242711000_2.jpg", "9"));
list.add(new PhotoBean("http://hbimg.b0.upaiyun.com/91d18368338f1723702b104576ab065239b188fe107e6-nL9kfS_fw658", "10"));
list.add(new PhotoBean("http://i2.w.yun.hjfile.cn/doc/201303/78ebff0b-3b4b-4695-93b7-4b5f62312ce6_08.jpg", "11"));
adapter = new RecycleViewAdapter(MainActivity.this, list);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickLitener(new RecycleViewAdapter.OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
switch (view.getId()){
case R.id.image:
Toast.makeText(MainActivity.this, "点击了图片", Toast.LENGTH_SHORT).show();
break;
case R.id.button_1:
Toast.makeText(MainActivity.this, "点击了按钮1", Toast.LENGTH_SHORT).show();
break;
case R.id.button_2:
Toast.makeText(MainActivity.this, "点击了按钮2", Toast.LENGTH_SHORT).show();
break;
}
}
});
}
}
[本章完...]