ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private View mContentView;
public int mLayoutId;
public ViewHolder(@NonNull View itemView,int layoutId) {
super(itemView);
mContentView = itemView;
mLayoutId = layoutId;
mViews = new SparseArray<>();
}
public static ViewHolder get(Context context, ViewGroup parent, int layoutId){
View itemView = LayoutInflater.from(context).inflate(layoutId,parent,false);
ViewHolder holder = new ViewHolder(itemView,layoutId);
return holder;
}
public <T extends View> T getView(int viewId){
View view = mViews.get(viewId);
if(view == null){
view = mContentView.findViewById(viewId);
mViews.put(viewId,view);
}
return (T) view;
}
public void setText(int viewId,String text){
TextView textView = getView(viewId);
textView.setText(text);
}
public ViewHolder setImageResource(int viewId,int resId){
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
public ViewHolder setOnClickListener(int viewId,View.OnClickListener listener){
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
public ViewHolder setOnItemClickListener(View.OnClickListener listener){
mContentView.setOnClickListener(listener);
return this;
}
}
BaseRecyclerAdapter
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
protected Context mContext;
protected int mLayoutId;
protected List<T> mDatas;
public BaseRecyclerAdapter(Context context,List<T> datas){
mContext = context;
mDatas = datas;
}
public BaseRecyclerAdapter(Context context,int layoutId,List<T> datas){
mContext = context;
mLayoutId = layoutId;
mDatas = datas;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewHolder viewHolder = ViewHolder.get(mContext,parent,mLayoutId);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
convert(holder,mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
public abstract void convert(ViewHolder holder,T t);
}
MultiItemBaseRecyclerAdapter(多種itemViewType)
public abstract class MultiItemBaseRecyclerAdapter<T> extends BaseRecyclerAdapter<T>{
protected MultiItemTypeSupport<T> mMultiItemTypeSupport;
public MultiItemBaseRecyclerAdapter(Context context, List<T> datas,MultiItemTypeSupport multiItemTypeSupport) {
super(context, datas);
mMultiItemTypeSupport = multiItemTypeSupport;
}
@Override
public int getItemViewType(int position) {
return mMultiItemTypeSupport.getItemViewType(position,mDatas.get(position));
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
int layoutId = mMultiItemTypeSupport.getLayoutId(viewType);
ViewHolder holder = ViewHolder.get(mContext,parent,layoutId);
return holder;
}
interface MultiItemTypeSupport<T>{
int getLayoutId(int itemType);
int getItemViewType(int position,T t);
}
}
使用
public class MainActivity extends AppCompatActivity {
List<String> list = new ArrayList<>();
List<String> list_double = new ArrayList<>();
BaseRecyclerAdapter<String> adapter;
MultiItemBaseRecyclerAdapter<String> adapter_double;
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
RecyclerView recyclerView_double = findViewById(R.id.recyclerView_double);
LinearLayoutManager layoutManager= new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
for(int i = 0;i<30;i++){
list.add("測試文字"+i);
}
adapter = new BaseRecyclerAdapter<String>(this,R.layout.item_left,list) {
@Override
public void convert(ViewHolder holder, String s) {
holder.setText(R.id.text,s);
}
};
recyclerView.setAdapter(adapter);
LinearLayoutManager layoutManager1= new LinearLayoutManager(this);
layoutManager1.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView_double.setLayoutManager(layoutManager1);
addList();
adapter_double = new MultiItemBaseRecyclerAdapter<String>(this,list_double,multiItemTypeSupport) {
@Override
public void convert(ViewHolder holder, String s) {
holder.setText(R.id.text,s);
}
};
recyclerView_double.setAdapter(adapter_double);
}
private void addList(){
String[] strings = new String[]{"在麼","在","喫過飯了麼","沒","你在幹嘛","看電視","看什麼電視","海綿寶寶","海綿寶寶","好看麼","不好看"};
list_double = Arrays.asList(strings);
}
private MultiItemBaseRecyclerAdapter.MultiItemTypeSupport multiItemTypeSupport = new MultiItemBaseRecyclerAdapter.MultiItemTypeSupport() {
@Override
public int getLayoutId(int itemType) {
switch(itemType){
case 0:
return R.layout.item_left;
case 1:
return R.layout.item_right;
default:
return -1;
}
}
@Override
public int getItemViewType(int position, Object o) {
return (position%2==0)?0:1;
}
};
}