簡體   English   中英

在回收站視圖中跳過項目

[英]Skip items in recycler view

嗨,我想從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的項目。 我的邏輯工作項目不可見,但他們留下了空間。 如何刪除項目之間的空格。

有一個非常簡單的解決方案:

如果執行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
    }

}

我希望這有幫助。 快樂編碼!

您可以從arraylist中刪除項目,然后通過這種方式將更新的數組列表傳遞給適配器,您不需要使用您的視圖的可見性

讓我們深入了解回收者視圖的工作原理

我們有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
 }

所以你可以使用這些知識專門跳過視圖的綁定

假設您有一個接受postion作為參數的函數並返回實際位置作為結果

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中,由recycleler視圖用來決定視圖的數量

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

我希望這有助於提高您的靈活性,使您可以添加更多過濾器並使用相同的數據集...更輕松地跳過視圖

通過使它們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);
}
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())           
}

您需要設置持有者的可見性,而不是您的觀點。

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的可見性

你應該使用View.GONE而不是View.INVISIBLE

無形

此視圖不可見,但它仍占用布局空間。

GONE

此視圖不可見,並且不需要任何空間用於布局。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM