【问题标题】:How to add item divider in RecyclerView for specific items如何在 RecyclerView 中为特定项目添加项目分隔符
【发布时间】:2018-10-13 20:25:41
【问题描述】:

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

  • B 项C 部分 之间
  • C3 项D 部分 之间
  • Item D2Section E之间
  • Item E3Item F1 之间
  • Item F1Item 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();
    }
}

【问题讨论】:

    标签: java android android-recyclerview android-adapter


    【解决方案1】:

    一种解决方案是像这样删除所有分隔符:

    首先定义你的 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"));
    

    【讨论】:

    • 你从哪里得到YourCustomDivider?里面需要写什么代码?
    【解决方案2】:

    如果我需要部分之间的分隔符,我会尝试在全局的 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 */
    }
    

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

    烤肉

    【讨论】:

    • 我不想在 TextView 下方设置分隔线。我想要 TextView 上方的分隔线和 TextView 下方的项目组下方。
    • 正如我所提到的,您可以使用任何自定义布局。适配器会检测到它是一个 SectionHeader 类型,它会返回你提供的布局。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      解决方案是编写自定义 RecyclerView.ItemDecoration 并仅在您想要的位置绘制分隔线。您应该覆盖魔术发生的 onDraw() 方法。 您可以使用以下代码在 RecyclerView 中设置自定义 ItemDecoration:

      recyclerView.addItemDecoration(new CustomItemDecoration());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2015-10-02
        • 2016-03-09
        • 1970-01-01
        • 2018-11-03
        相关资源
        最近更新 更多