繁体   English   中英

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

[英]How to add item divider in RecyclerView for specific items

是否可以仅在RecyclerView为特定项目添加项目分隔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();
    }
}

一种解决方案是删除所有分隔符,如下所示:

首先定义你的 RecyclerView :

RecyclerView recycle = (RecyclerView) findViewById(R.id.recyclerView);

并在您的活动中使用此方法:

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"));

是的,你可以做的是在你的 row.xml 布局中,创建你的自定义分隔符并根据onBindViewholder()方法中的条件显示/隐藏它

如果我需要部分之间的分隔符,我会尝试在 recyclerview 适配器类中全局定义部分标题的类型:

private static final int TYPE_SMS_MESSAGE = 0;
private static final int TYPE_PHONE_CALL = 1;
private static final int TYPE_SECTION_HEADER = 2;

然后我会返回一个带有 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;
    }
}

为了能够检测并返回此布局,您需要检测它是 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.ItemDecoration 并仅在您想要的地方绘制分隔线。 您应该覆盖发生魔法的 onDraw() 方法。 您可以使用以下代码在 RecyclerView 中设置自定义 ItemDecoration:

recyclerView.addItemDecoration(new CustomItemDecoration());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM