如何在 RecyclerView 中为特定项目添加项目分隔符
How to add item divider in RecyclerView for specific items
是否可以在 RecyclerView
中仅为特定项目添加项目分隔符?当前,项目分隔符应用于每个项目之间。我想在以下位置添加分隔线:
- 在项目 B 和部分 C
之间
- 在项目 C3 和部分 D
之间
- 在项目 D2 和 E 部分
之间
- 在项目E3和项目F1
之间
- 在项目 F1 和 项目 G1
之间
当前结果
片段
public class FragmentRV extends android.support.v4.app.Fragment {
RecyclerView mRecyclerView;
public FragmentRV() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_rv, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
View v = getView();
assert v != null;
mRecyclerView = v.findViewById(R.id.my_recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mRecyclerView.addItemDecoration(new DividerItemDecoration(Objects.requireNonNull(getContext()), LinearLayout.VERTICAL));
super.onActivityCreated(savedInstanceState);
initRVAdapter();
}
private void initRVAdapter(){
List<Object> itemsList = new ArrayList<>();
RVItemsAapter itemsListAdapter = new RVItemsAapter(getContext());
mRecyclerView.setAdapter(itemsListAdapter);
itemsList.add(new SMSmessage("Item A","Item A description"));
itemsList.add(new Phonecall("Item B","Item B description"));
itemsList.add(new SectionHeader("Section C"));
itemsList.add(new SMSmessage("Item C1","Item C1 description"));
itemsList.add(new SMSmessage("Item C2","Item C2 description"));
itemsList.add(new SMSmessage("Item C3","Item C3 description"));
itemsList.add(new SectionHeader("Section D"));
itemsList.add(new SMSmessage("Item D1","Item D1 description"));
itemsList.add(new SMSmessage("Item D2","Item D2 description"));
itemsList.add(new SectionHeader("Section E"));
itemsList.add(new SMSmessage("Item E1","Item E1 description"));
itemsList.add(new SMSmessage("Item E2","Item E2 description"));
itemsList.add(new SMSmessage("Item E3","Item E3 description"));
itemsList.add(new SMSmessage("Item F1","Item F1 description"));
itemsList.add(new Phonecall("Item G1","Item G1 description"));
itemsListAdapter.setCallSMSFeed(itemsList);
itemsListAdapter.notifyDataSetChanged();
}
}
是的,您可以在 row.xml 布局中创建自定义分隔线,并根据 onBindViewholder()
方法
中的条件显示/隐藏它
一个解决方案是移除所有分隔线,如下所示:
首先定义你的 RecyclerView :
RecyclerView recycle = (RecyclerView) findViewById(R.id.recyclerView);
并在您的 activity 中使用此方法:
recycle.addItemDecoration(new DividerItemDecoration(context, 0));
然后在您的自定义适配器中,您可以在需要的地方添加分隔线:
itemsList.add(new SMSmessage("Item A","Item A description"));
itemsList.add(new Phonecall("Item B","Item B description"));
itemsList.add(new YourCustomDivider());
itemsList.add(new SectionHeader("Section C"));
一个解决方案是编写自定义 RecyclerView.ItemDecoration 并仅在您想要的位置绘制分隔线。您应该在魔法发生的地方覆盖 onDraw() 方法。
您可以使用以下代码在 RecyclerView 中设置自定义 ItemDecoration:
recyclerView.addItemDecoration(new CustomItemDecoration());
如果我需要部分之间的分隔符,我会尝试在 recyclerview 适配器 class 中全局定义部分 headers 的类型:
private static final int TYPE_SMS_MESSAGE = 0;
private static final int TYPE_PHONE_CALL = 1;
private static final int TYPE_SECTION_HEADER = 2;
然后我会 return 一个带有 TextView 和下面的分隔线的布局。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_SMS_MESSAGE:
// return a view as you did before
case TYPE_PHONE_CALL:
// return a view as you did before
case TYPE_SECTION_HEADER:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.section_header_layout, null);
return new YourRecyclerViewHolder(v);
default:
return null;
}
}
为了能够检测并return此布局,您需要检测它是 SectionHeader 的一个实例。
@Override
public int getItemViewType(int position) {
if (itemList.get(position) instanceof SectionHeader) {
return TYPE_SECTION_HEADER;
}
/* return TYPE_SECTION_HEADER if the data in the list is an instance of
SectionHeader and other corresponding types as well */
}
希望这能帮助您产生想法并取得进展!
快乐编码:)
巴基
是否可以在 RecyclerView
中仅为特定项目添加项目分隔符?当前,项目分隔符应用于每个项目之间。我想在以下位置添加分隔线:
- 在项目 B 和部分 C 之间
- 在项目 C3 和部分 D 之间
- 在项目 D2 和 E 部分 之间
- 在项目E3和项目F1 之间
- 在项目 F1 和 项目 G1 之间
当前结果
片段
public class FragmentRV extends android.support.v4.app.Fragment {
RecyclerView mRecyclerView;
public FragmentRV() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_rv, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
View v = getView();
assert v != null;
mRecyclerView = v.findViewById(R.id.my_recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mRecyclerView.addItemDecoration(new DividerItemDecoration(Objects.requireNonNull(getContext()), LinearLayout.VERTICAL));
super.onActivityCreated(savedInstanceState);
initRVAdapter();
}
private void initRVAdapter(){
List<Object> itemsList = new ArrayList<>();
RVItemsAapter itemsListAdapter = new RVItemsAapter(getContext());
mRecyclerView.setAdapter(itemsListAdapter);
itemsList.add(new SMSmessage("Item A","Item A description"));
itemsList.add(new Phonecall("Item B","Item B description"));
itemsList.add(new SectionHeader("Section C"));
itemsList.add(new SMSmessage("Item C1","Item C1 description"));
itemsList.add(new SMSmessage("Item C2","Item C2 description"));
itemsList.add(new SMSmessage("Item C3","Item C3 description"));
itemsList.add(new SectionHeader("Section D"));
itemsList.add(new SMSmessage("Item D1","Item D1 description"));
itemsList.add(new SMSmessage("Item D2","Item D2 description"));
itemsList.add(new SectionHeader("Section E"));
itemsList.add(new SMSmessage("Item E1","Item E1 description"));
itemsList.add(new SMSmessage("Item E2","Item E2 description"));
itemsList.add(new SMSmessage("Item E3","Item E3 description"));
itemsList.add(new SMSmessage("Item F1","Item F1 description"));
itemsList.add(new Phonecall("Item G1","Item G1 description"));
itemsListAdapter.setCallSMSFeed(itemsList);
itemsListAdapter.notifyDataSetChanged();
}
}
是的,您可以在 row.xml 布局中创建自定义分隔线,并根据 onBindViewholder()
方法
一个解决方案是移除所有分隔线,如下所示:
首先定义你的 RecyclerView :
RecyclerView recycle = (RecyclerView) findViewById(R.id.recyclerView);
并在您的 activity 中使用此方法:
recycle.addItemDecoration(new DividerItemDecoration(context, 0));
然后在您的自定义适配器中,您可以在需要的地方添加分隔线:
itemsList.add(new SMSmessage("Item A","Item A description"));
itemsList.add(new Phonecall("Item B","Item B description"));
itemsList.add(new YourCustomDivider());
itemsList.add(new SectionHeader("Section C"));
一个解决方案是编写自定义 RecyclerView.ItemDecoration 并仅在您想要的位置绘制分隔线。您应该在魔法发生的地方覆盖 onDraw() 方法。 您可以使用以下代码在 RecyclerView 中设置自定义 ItemDecoration:
recyclerView.addItemDecoration(new CustomItemDecoration());
如果我需要部分之间的分隔符,我会尝试在 recyclerview 适配器 class 中全局定义部分 headers 的类型:
private static final int TYPE_SMS_MESSAGE = 0;
private static final int TYPE_PHONE_CALL = 1;
private static final int TYPE_SECTION_HEADER = 2;
然后我会 return 一个带有 TextView 和下面的分隔线的布局。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_SMS_MESSAGE:
// return a view as you did before
case TYPE_PHONE_CALL:
// return a view as you did before
case TYPE_SECTION_HEADER:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.section_header_layout, null);
return new YourRecyclerViewHolder(v);
default:
return null;
}
}
为了能够检测并return此布局,您需要检测它是 SectionHeader 的一个实例。
@Override
public int getItemViewType(int position) {
if (itemList.get(position) instanceof SectionHeader) {
return TYPE_SECTION_HEADER;
}
/* return TYPE_SECTION_HEADER if the data in the list is an instance of
SectionHeader and other corresponding types as well */
}
希望这能帮助您产生想法并取得进展! 快乐编码:)
巴基