版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_he_n/article/details/83927236
1.背景介绍
最近在做一个项目,需要展示的效果如下:
按照类型去分组展示,但是针对特定的类型,又有不同的来源,单击来源进行加载相应的数据。
总共有三种类型,分三种标签,标题one,水平滚动recyclerview和标题three,在第二标签下需要分不同数据来源,用户单击不同的来源进行加载。
2.准备工作
在build.gradle中添加下面的依赖:
implementation 'com.android.support:recyclerview-v7:28.0.0'
3.技术简介
整体采用recyclerview实现分组的展示,设置两种类型,一种标题类型,一种是item展示类型,为了能够更好的展示,我新增了一个类型,这个类型为了展示数据来源的。
在MultiItemViewHolder添加一个recyclerview 视图,展示数据来源的数据,并监听click事件,来实现不同数据源切换和刷新。
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<CommonData> commonDataList;
private Context context;
public MyAdapter(Context context, List<CommonData> commonDataList) {
this.commonDataList = commonDataList;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
switch (viewType) {
case CommonData.TYPE_ONE:
case CommonData.TYPE_THR:
return new CommonViewHolder(LayoutInflater.from(context).inflate(R.layout.title_layout_main, viewGroup, false));
case CommonData.TYPE_CONTENT:
return new CommonViewHolder(LayoutInflater.from(context).inflate(R.layout.content_layout_main, viewGroup, false));
case CommonData.TYPE_TWO:
return new MultiItemViewHolder(LayoutInflater.from(context).inflate(R.layout.multi_item_layout, viewGroup, false));
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
int type = getItemViewType(position);
switch (type) {
case CommonData.TYPE_ONE:
case CommonData.TYPE_THR:
case CommonData.TYPE_CONTENT://内容和标题展示,只是内容和标题采用的是一个布局。
((CommonViewHolder) viewHolder).bindData(commonDataList.get(position));
break;
case CommonData.TYPE_TWO://嵌套recyclerview的地方
((MultiItemViewHolder) viewHolder).bindData(commonDataList.get(position));
break;
}
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
GridLayoutManager linearLayoutManager = new GridLayoutManager(context, 4);
linearLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
switch (getItemViewType(i)) {
case CommonData.TYPE_ONE:
case CommonData.TYPE_TWO:
case CommonData.TYPE_THR:
return 4;
case CommonData.TYPE_CONTENT:
return 1;
}
return 1;
}
});
recyclerView.setLayoutManager(linearLayoutManager);
}
/**
* 刷新数据
*
* @param list
*/
public void refresh(List<CommonData> list) {
commonDataList.clear();
commonDataList.addAll(list);
}
@Override
public int getItemCount() {
return commonDataList.size();
}
@Override
public int getItemViewType(int position) {
return commonDataList.get(position).getType();
}
}
MultiItemViewHolder.class
public class MultiItemViewHolder extends BaseViewHolder<CommonData> {
private RecyclerView recyclerView;
private TextView textView;
public MultiItemViewHolder(@NonNull View itemView) {
super(itemView);
recyclerView = itemView.findViewById(R.id.multi_item_recylerview);
textView = itemView.findViewById(R.id.title);
}
@Override
public void bindData(CommonData commonData) {
textView.setText((String) commonData.getData());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
SelfAdapter selfAdapter = new SelfAdapter(getData(), itemView.getContext());
recyclerView.setAdapter(selfAdapter);
}
/**
* 数据源,为了方便,在这里写的测试数据
*
* @return
*/
private List<CommonData> getData() {
List<CommonData> temp = new ArrayList<>();
for (int index = 0; index < 10; index++) {
temp.add(new CommonData("数据来源" + index, CommonData.TYPE_TWO));
}
return temp;
}
/**
* 数据源的adapter
*/
class SelfAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<CommonData> list;
Context context;
public SelfAdapter(List<CommonData> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new SelfViewHolder(LayoutInflater.from(context).inflate(R.layout.new_title_layout_main, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
((SelfViewHolder) viewHolder).bindData(list.get(i));
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(true);
}
}
class SelfViewHolder extends BaseViewHolder<CommonData> {
TextView textView;
public SelfViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_title);
}
@Override
public void bindData(final CommonData commonData) {
textView.setText((String) commonData.getData());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemView.setEnabled(false);
if (v.getContext() instanceof MainActivity) {//更新数据
Message msg = Message.obtain();
msg.what = 1;
msg.obj = getAdapterPosition();
((MainActivity) v.getContext()).handler.sendMessage(msg);
}
}
});
}
}
}