Как скрыть элементы RecyclerView - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу скрыть некоторые элементы RecyclerView, как показано на рисунке.При нажатии кнопки «Просмотреть все» макет должен развернуться, а остальные элементы должны быть видны.

RecyclerView

В RecyclerView всего 12 элементов.Одна строка должна быть скрыта.

Я пытался сделать элементы невидимыми в начале и установить их видимыми при нажатии view all при вызове метода.

В адаптере, который я пробовалthis

@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int i) {
if(i >= 8)
    {
        holder.productName.setVisibility(View.INVISIBLE);
        holder.product_image.setVisibility(View.INVISIBLE);
    }
}
public void viewAll() {
    //unable to create holder object here
    if(holder.productName.getVisibility() == View.INVISIBLE)
    {
        holder.productName.setVisibility(View.INVISIBLE);
        holder.product_image.setVisibility(View.INVISIBLE);
    }

}

Но я не могу создать экземпляр ViewHolder в методе view all.А также создаются пустые места, где элементы невидимы.Какие еще техники вы считаете лучше?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Добавьте переменную int maxCount = 8 и измените код на это:

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int i) {
        if (i >= maxCount) {
            holder.productName.setVisibility(View.GONE);
            holder.product_image.setVisibility(View.GONE);
        }
    }

И измените maxCount на Просмотреть все нажмите;

    public void viewAll() {
        maxCount = 12;
        notifyDataSetChanged();
    }
1 голос
/ 02 апреля 2019

AFAIK на Android вы не можете скрыть / показать элементы в recycleView (оптимизированным способом) без изменения списка источников элементов. (я имею в виду динамическое удаление / добавление элементов в определенной позиции, начале, середине или конце списка)

Тем не менее, изменить источник данных и обновить список с таким небольшим количеством элементов довольно легко и можно сделать с помощью простого notifyDataSetChanged

Вкл. Activity/Fragment создать список с переменной class-scoped. Я пишу пример на Activity, так как я не знаю, используете ли вы Activity или Fragment. Обь это будет то же самое с fragment.

public class MyActivity extends AppCompatActivity {

    private ArrayList<MyItem> myItems; //or List<MyItem> or whatever


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        //init everything

        myItems = getVisibleItems(); //create a method that returns the visible items, based on your logics. You can also avoid creating a method and simply retrieve items; as you prefer.

        myAdapter = new MyAdapter(MyActivity.this, myItems);
        myRecyclerView.setLayoutManager(new LinearLayoutManager(MyActivity.this));
        myRecyclerView.setAdapter(myAdapter);

    }
    //other stuffs
}

Затем, когда вы захотите изменить элементы списка, просто обновите свой ArrayList ( или список, или что-то еще ) и сообщите адаптеру, что что-то изменилось.

private void updateList(){
    myItems = getVisibleItems();
    myAdapter.notifyDataSetChanged();
}

Примечание: вам не нужно копировать список в адаптере, используйте то же самое, что и вы, например:

ArrayList<MyItems> adapterSource = null;
//constructor
public MyAdapter(Context ctx, ArrayList<MyItems> items){
    //other stuff
    this.adapterSource = items;
}

Обратите внимание, я написал это вручную без компилятора, возможно, он не идеален.

Дайте мне знать, помогло ли это!

0 голосов
/ 02 апреля 2019

определить локальную переменную

var Int count = 8

дисплей, как в вашем коде

в viewAll набор методов count = 12 и обновление адаптера через слушатель для активности

...