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

т, я хочу пропустить некоторые предметы из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" />

И переработчик вид

   @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. Моя логика работает, элементы не видны, но они оставляют там пространство. Как я могу удалить пробелы между элементами.

 Nilesh Rathod05 окт. 2017 г., 12:09
попробуйте что-то вроде этого удалить элементы из списка массивовif (download.isEmpty()==true && desc_new.isEmpty()==true) { remove this item from array list }
 Ionut J. Bejan05 окт. 2017 г., 11:53
У вас естьLinearLayout для каждого элемента RecyclerView?
 Selim YILDIZ05 окт. 2017 г., 14:21
вы можете удалить, прежде чем показывать элементы из вашей коллекции данных.
 FarshidABZ05 окт. 2017 г., 11:50
holder.itemview.setVisibility (GONE)

Ответы на вопрос(7)

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);
}
 Shahroz javaid05 окт. 2017 г., 11:56
Я пытался ушел уже. но не работает
 Shahroz javaid05 окт. 2017 г., 12:10
нет, я установил его в XML. Вы можете увидеть XML выше. @MuratK.
 Murat Karagöz05 окт. 2017 г., 12:11
@Shahrozjavaid Да, именно поэтому вы должны установить егоgone снова в ветке else. Делай, как мой ответ, пожалуйста.
 YoLo05 окт. 2017 г., 11:56
не использовать ушел использовать невидимый
 Murat Karagöz05 окт. 2017 г., 11:57
@ Shahrozjavaid Где ты это сделал? Вы установили этоgone в остальной ветке`?
Решение Вопроса

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

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

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

 cursor.moveToPosition(position)

или же

 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
 }

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

 Shahroz javaid05 окт. 2017 г., 12:33
Я не хочу невидимых конкретных предметов. Я хочу сделать невидимыми все те предметы, которые не соответствуют моим вышеприведенным условиям. как я получаю данные с сервера. представление переработчика получает позиции данных, как вы объяснили, и показывает их. Я делаю некоторые вещи проверенными. они не отображаются в пользовательском интерфейсе, но есть места для элементов \ @Tushar Saha
 Tushar Saha05 окт. 2017 г., 12:41
он не будет невидимым для этих элементов ... он пропустит эти элементы, поскольку bindview не будет иметь к ним доступа, поэтому также не будет пробелов, убедитесь, что функция getPosition правильно реализована

Если вы выполняете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


        }

    }

onBindViewHolder:

@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
    }

}

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

View.GONE вместоView.INVISIBLE

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())           
}
 Nilesh Rathod05 окт. 2017 г., 12:18
@Shahrozjavaid попробуйте что-то вроде этого удалить элементы из списка массивовif (download.isEmpty()==true && desc_new.isEmpty()==true) { remove this item from array list }
 Shahroz javaid05 окт. 2017 г., 12:17
уже попробовал. Не работает
 Shahroz javaid05 окт. 2017 г., 12:22
Я хочу скрыть все остальное, чем я обусловил. элементы не отображаются. Есть места в представлении переработчика. Я пытался решить, что вы предлагаете.

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

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

        //Hide the items
   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())           
}
 Anonymous05 окт. 2017 г., 11:57
Вы должны использовать view.GONE, а не view.INVISIBLE
 Anonymous05 окт. 2017 г., 13:22
Не делайте в XML .. Вы должны справиться с этим в коде
 Shahroz javaid05 окт. 2017 г., 12:11
Использование ушел в XML
 Shahroz javaid05 окт. 2017 г., 11:55
но места не собираются
 Shahroz javaid05 окт. 2017 г., 11:55
уже скрыть это.

а не ваши взгляды.

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

 Shahroz javaid05 окт. 2017 г., 11:58
тоже пробовал это но не работает
 meeeee05 окт. 2017 г., 15:35
@Shahrozjavaid проверить обновление

Ваш ответ на вопрос