Пропускать элементы в представлении переработчика

Привет, я хочу пропустить некоторые элементы из recyclerview.

вот скриншот

Вот кусок кода

item_Data.xml

 <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_marginTop="10dp"
android:id="@+id/mainlayout"
android:layout_height="wrap_content">
<ImageView
    android:visibility="gone"
    android:id="@id/image"
    android:layout_gravity="center"
    android:layout_width="100dp"
    android:layout_height="100dp" />
<TextView
    android:visibility="gone"
    android:textStyle="bold"
    android:id="@id/title"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:maxLength="15" />

And recycler view is

   @Override
public void onBindViewHolder(final MovieViewHolder holder, final int position) {
    String download= news.get((position)).getDownloadLinkForApkNew();
    String desc_new = news.get(position).getApkJData();
    if (download.isEmpty()==false && desc_new.isEmpty()==false) {
        holder.movieTitle.setVisibility(View.VISIBLE);
        holder.imageView.setVisibility(View.VISIBLE);
        Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
        holder.movieTitle.setText(news.get(position).getTitle().getRendered());
    }

Мне не нужны элементы, у которых нет загрузки и desc_new. Элементы моей логики не видны, но они оставляют место. как убрать пробелы между элементами.


person Shahroz javaid    schedule 05.10.2017    source источник
comment
держатель.itemview.setVisibility(УДАЛЕНО)   -  person FarshidABZ    schedule 05.10.2017
comment
У вас есть LinearLayout для каждого элемента RecyclerView?   -  person Ionut J. Bejan    schedule 05.10.2017
comment
попробуйте что-то вроде этого удалить элементы из списка массивов if (download.isEmpty()==true && desc_new.isEmpty()==true) { remove this item from array list }   -  person AskNilesh    schedule 05.10.2017
comment
вы можете удалить перед показом элементов из вашей коллекции данных.   -  person Selim YILDIZ    schedule 05.10.2017


Ответы (7)


Давайте углубимся в то, как работает представление ресайклера.

у нас есть 2 функции onCreateView и onBindview. Поскольку имена функций вполне понятны, onCreateView создает представление, а onBindView берет созданное представление и привязывает к нему данные.

теперь давайте предположим, что весь тип представления аналогичен, и вы используете массив объектов или курсор для заполнения всего представления.

поэтому в bindView для получения данных вы должны были использовать либо

 cursor.moveToPosition(position)

or

 mList.get(position)

как вы можете видеть, что привязка происходит на основе позиции, которую мы получаем из аргументов onBindView

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
     //mList.get(position) or cursor.moveToPosition
 }

так что вы можете использовать эти знания, чтобы специально пропустить привязку представления

скажем, у вас есть функция, которая принимает позицию в качестве параметра и возвращает фактическую позицию в качестве результата

private int getActualPostion(int position){
     //your logic to skip the given postion 
     //say  if(position == 4){return postion+2}
}

так что вы можете реализовать что-то вроде этого

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
       mList.get(getActualPosition(position));
 }

это позволит вам пропустить те представления, которые не должны отображаться

наконец, в методе getCount, который используется представлением переработчика для определения количества просмотров.

 @Override
 public int getItemCount() {
     //foreach in array { if(already downloaded) i++} 
     // return array.size - i
 }

Я надеюсь, что это поможет, это также даст вам больше гибкости, так как вы можете добавить больше фильтров и использовать тот же набор данных ... легче пропускать просмотры

person Tushar Saha    schedule 05.10.2017
comment
Я не хочу, чтобы определенные элементы были невидимыми. Я хочу сделать невидимыми все те элементы, которые не соответствуют моему вышеуказанному условию. как я получаю данные с сервера. представление recycler получает позиции данных, как вы объяснили, и показывает их. Я делаю некоторые пункты пропали чеком. они не отображаются в пользовательском интерфейсе, но есть пробелы между элементами \ @Tushar Saha - person Shahroz javaid; 05.10.2017
comment
он не будет невидимым для этих элементов... он пропустит эти элементы, поскольку у bindview не будет к ним доступа, поэтому также не будет никаких пробелов, убедитесь, что функция getPosition правильно реализована - person Tushar Saha; 05.10.2017
comment
Что такое курсор? - person IgorGanapolsky; 13.11.2019

Для этого есть очень простое решение:

Если вы выполняете view.setVisibility(View.GONE); для представления при привязке его к ViewHolder, представление будет скрыто, но все равно будет место прямо там, где представление должно было быть; поэтому этот подход неэффективен.

Как же тогда решить эту проблему?

Все, что вам нужно сделать, это установить высоту и/или ширину представления, которое вы пытаетесь скрыть, равными нулю. Вот простой способ добиться этого:

Вид держателя:

    public class MyViewHolder extends RecyclerView.ViewHolder{

        public LinearLayout.LayoutParams params;
        public LinearLayout rootView //the outermost view from your layout. Note that it doesn't necessarily have to be a LinearLayout.

        //todo: Don't forget to add your other views

        public MyViewHolder(View itemView){
            super(itemView);

            params = new LinearLayout.LayoutParams(0, 0);
            rootView = itemView.findViewById(R.id.rootView);

            //todo: Don't forget to initialize your views


        }

    }

онбиндвиевхолдер:

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position){

    if(your_condition){
        holder.rootView.setLayoutParams(holder.params);  
        //this line hides the view completely
    }
    else{
        //todo: Do your regular stuff
    }

}

Надеюсь, это поможет. Веселого кодирования!

person Taslim Oseni    schedule 20.01.2019

Вы можете удалить элементы из arraylist, а затем передать обновленный список массивов адаптеру, таким образом, вам не нужно играть с видимостью ваших представлений.

person yogesh lokhande    schedule 05.10.2017

вам следует использовать View.GONE вместо View.INVISIBLE

НЕВИДИМЫЙ

Это представление невидимо, но оно по-прежнему занимает место для макета.

УДАЛЕНО

Это представление невидимо и не занимает места для макета.

if (download.isEmpty()==true && desc_new.isEmpty()==true) {

       holder.movieTitle.setVisibility(View.GONE);
       holder.imageView.setVisibility(View.GONE);

}else {
   holder.movieTitle.setVisibility(View.VISIBLE);
   holder.imageView.setVisibility(View.VISIBLE);
   Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
   holder.movieTitle.setText(news.get(position).getTitle().getRendered())           
}
person AskNilesh    schedule 05.10.2017
comment
@Shahrozjavaid попробуйте что-то вроде этого, удалите элементы из списка массивов if (download.isEmpty()==true && desc_new.isEmpty()==true) { remove this item from array list } - person AskNilesh; 05.10.2017
comment
Я хочу скрыть все остальное, чем я обусловлен. предметы не отображаются. в представлении ресайклера есть пробелы. Я попытался решить, что вы предлагаете. - person Shahroz javaid; 05.10.2017

Делая их View.INVISIBLE, вы не удаляете зарезервированные места. Вместо этого вы можете использовать View.GONE, чтобы сделать их невидимыми и позволить занять зарезервированное пространство.

Поскольку вы снова устанавливаете видимость Views, вы должны отменить ее с помощью предложения if-else, например.

if (!download.isEmpty() && !desc_new.isEmpty()) {
    // make visible
} else {
    // make invisible with gone e.g.
    holder.movieTitle.setVisibility(View.GONE);
    holder.imageView.setVisibility(View.GONE);
}
person Murat Karagöz    schedule 05.10.2017
comment
не использовать исчезнувший использовать невидимый - person yogesh lokhande; 05.10.2017
comment
@Shahrozjavaid Где ты это сделал? Вы установили его на gone в ветке else`? - person Murat Karagöz; 05.10.2017
comment
нет, я удалил его в xml. вы можете увидеть xml выше. @МуратК. - person Shahroz javaid; 05.10.2017
comment
@Shahrozjavaid Да, именно поэтому вам нужно снова установить его на gone в ветке else. Сделайте, как мой ответ, пожалуйста. - person Murat Karagöz; 05.10.2017

Вам нужно установить видимость для вашего держателя, а не для ваших просмотров.

if (download.isEmpty()==true && desc_new.isEmpty()==true) {
  holder.setVisibility(View.GONE);

}else {
   holder.setVisibility(View.VISIBLE);
   Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
   holder.movieTitle.setText(news.get(position).getTitle().getRendered())           
}

также удалите видимость из вашего xml

person meeeee    schedule 05.10.2017
comment
Нет такого метода как setVisibility(int) в RecyclerView.ViewHolder. - person rupinderjeet; 22.11.2020

person    schedule
comment
но пробелы не идут - person Shahroz javaid; 05.10.2017
comment
вы должны использовать view.GONE, а не view.INVISIBLE - person Sharath kumar; 05.10.2017
comment
Использование go в XML - person Shahroz javaid; 05.10.2017