简单封装RecyclerView的Adapter

来源:互联网 发布:无损音频压缩算法 编辑:程序博客网 时间:2024/05/15 10:58


项目的开发中会经常使用的RecyclerView用来做列表数据的展示,但是不能每次都写一次Adapter,现在就先对常规展示的adapter做一个封装。
主要思想:封装一些常规性动作,至于不确定的动作字节暴露给子类实现
package com.recyclerviewdemo.adapter;
 
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
 
import java.util.List;
 
/**
* RecyclerView中Adapter的抽取
*
* @param <ENTITY> 当前数据源对象类型
*/
public abstract class BaseAdapter<ENTITY> extends RecyclerView.Adapter {
private Context context;
/**
* 数据源对象
*/
private List<ENTITY> data;
 
/**
* 获取到item布局文件:因为必须要有布局文件,采用抽象方法
*
* @return 布局文件id引用
*/
@LayoutRes
public abstract int getItemViewLayoutResId();
 
/**
* 构造方法
*
* @param context 上下文对象
* @param data 数据源
*/
public BaseAdapter(Context context, List<ENTITY> data) {
this.context = context;
this.data = data;
}
 
/**
* 获取到当前索引的数据对象
*
* @param position 需要获取对象的索引
* @return
*/
public ENTITY getItem(int position) {
return data.get(position);
}
 
@Override
public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//加载布局文件
View nomal = View.inflate(context, getItemViewLayoutResId(), null);
return new NomalHolder(nomal);
}
 
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//给布局文件设置数据
if (holder instanceof MyBaseAdapter.NomalHolder) {
onBindItemViewHolder((NomalHolder) holder, position);
}
}
 
/**
* 给布局文件设置数据
*
* @param holder 对应布局文件对象
* @param position 当前布局文件对应的索引:通过索引获取数据对象
*/
protected abstract void onBindItemViewHolder(NomalHolder holder, int position);
 
@Override
public int getItemCount() {
if (data != null) {
return data.size();
}
return 0;
}
 
/**
* 正常的ViewHolder类
*/
class NomalHolder extends RecyclerView.ViewHolder {
private View itemView;
 
/**
* 构造方法
*
* @param itemView 需要加载的view
*/
public NomalHolder(View itemView) {
super(itemView);
this.itemView = itemView;
}
 
/**
* 初始化当前view的控件
*
* @param viewId 控件id值
* @param <VIEW> 当前控件的类型
* @return
*/
public <VIEW> VIEW getNomalView(int viewId) {
return (VIEW) itemView.findViewById(viewId);
}
}
}

使用起来也很简单
注意:因为在父类中对view已经进行了转换所以子类使用时只需要定义出view的类型即可,不需要强转
package com.recyclerviewdemo.adapter;
 
import android.content.Context;
import android.widget.TextView;
 
import com.recyclerviewdemo.R;
 
import java.util.List;
 
/**
* 子类的Adapter
*/
public class TextAdapter extends MyBaseAdapter<String> {
 
/**
* 构造方法
*
* @param context 上下文对象
* @param data 数据源集合对象
*/
public TextAdapter(Context context, List<String> data) {
super(context, data);
}
 
/**
* 获取当前item布局文件
*
* @return 布局文件id
*/
@Override
public int getItemViewLayoutResId() {
return R.layout.item_text_noaml;
}
 
/**
* 绑定布局文件,并给控件设置数据
*
* @param holder 每个item的view对象
* @param position 当前item的索引值
*/
@Override
protected void onBindItemViewHolder(NomalHolder holder, int position) {
//获取到布局控件
TextView title = holder.getNomalView(R.id.tv_title);
//给控件设置数据
title.setText(getItem(position));
}
}

布局文件也晒一下吧
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
 
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="asdfasdf" />
</LinearLayout>

对于Activity中就是简单的获取到recyclerView 控件,并给控件添加数据就可以了
recyclerView = (RecyclerView) findViewById(R.id.rv_recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
List<String> data = new ArrayList<>();
for (int x = 0; x < 10; x++) {
data.add(" 当前数量" + x);
}
TextAdapter adapter = new TextAdapter(TextActivity.this, data);
recyclerView.setAdapter(adapter);






0 0