用习惯了ListView和GridView的通用的Adapter和ViewHolder,为高级版的RecyclerView也修改一个通用的。
Adapter
package adapter;
import android.support.v7.widget.RecyclerView;
import java.util.List;
public abstract class RecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
private List<T> data;
public RecyclerAdapter(List<T> data) {
this.data = data;
}
@Override
public int getItemCount() {
return data.size();
}
}
代入泛型的抽象类,使用时需要重写
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
}
RecyclerView必须有ViewHolder实例,那么ViewHolder
package adapter;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import org.xutils.image.ImageOptions;
import org.xutils.x;
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
private View view;
public RecyclerViewHolder(View itemView) {
super(itemView);
this.view = itemView;
}
@SuppressWarnings("unchecked")
public <T extends View> T get(int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
/**
* 设置TextView的文字
*
* @param id textView对应id
* @param text 文字
*/
public void setTVText(int id, String text) {
TextView tv = get(id);
tv.setText(text);
}
/**
* 设置ImageView的图片
*
* @param id ImageView对应id
* @param drawableId 图片id
*/
public void setImageDrawable(int id, int drawableId) {
ImageView imageView = get(id);
imageView.setImageResource(drawableId);
}
/**
* 设置ImageView的图片
*
* @param id ImageView对应id
* @param bm bitmap
*/
public void setImageBitmap(int id, Bitmap bm) {
ImageView imageView = get(id);
imageView.setImageBitmap(bm);
}
使用样例
RecyclerAdapter<Entity> recyclerAdapter = new RecyclerAdapter<Entity>(data) {
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(getActivity()).inflate(R.layout.item, parent, false);
return new RecyclerViewHolder(v);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, final int position) {
//在这里设置item控件内容(与对应实体Entity相关)
//如holder.setTVText(R.id.tv, data.get(position).getName());
View itemView = holder.itemView;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击事件
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//长按事件
return true;
}
});
}
};
其余与正常RecyclerView使用方法一致。