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;
}
};
}