Как добавить разделитель элементов в RecyclerView для определенных элементов - PullRequest
0 голосов
/ 12 октября 2018

Можно ли добавить разделители элементов в RecyclerView только для определенных элементов?В настоящее время разделители элементов применяются между каждым элементом.Я хочу добавить разделитель в следующих местах:

  • между Элемент B и Раздел C
  • между Элемент C3 и Сечение D
  • между Элемент D2 и Сечение E
  • между Элемент E3 и Элемент F1
  • между Элемент F1 и Элемент G1

Текущий результат

Current result

Фрагмент

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();
    }
}

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Если бы мне понадобился разделитель между разделами, я бы попытался определить тип для заголовков разделов в глобальном классе адаптеров 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 */
}

Надеюсь, это поможет вам понять идобиться прогресса в этом!Счастливое кодирование:)

Baki

0 голосов
/ 12 октября 2018

Одним из решений будет удаление всех разделителей следующим образом:

Сначала определите свой 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"));
0 голосов
/ 12 октября 2018

Решением является написание пользовательского RecyclerView.ItemDecoration и рисование делителя только там, где вы хотите.Вы должны переопределить метод onDraw (), где происходит волшебство.Вы можете установить пользовательский ItemDecoration в RecyclerView, используя код ниже:

recyclerView.addItemDecoration(new CustomItemDecoration());
0 голосов
/ 12 октября 2018

Да, вы можете сделать это в своем макете row.xml, создать свой собственный разделитель и показать / скрыть его на основе условия в onBindViewholder() метод

...