[英]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.