如何在 RecyclerView 中为特定项目添加项目分隔符

How to add item divider in RecyclerView for specific items

是否可以在 RecyclerView 中仅为特定项目添加项目分隔符?当前,项目分隔符应用于每个项目之间。我想在以下位置添加分隔线:

当前结果

片段

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 */
}

希望这能帮助您产生想法并取得进展! 快乐编码:)

巴基