在回收者视图中跳过项目

Sha*_*aid 7 layout android android-recyclerview recyclerview-layout

嗨,我想从中跳过一些项目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" />
Run Code Online (Sandbox Code Playgroud)

回收者视图是

   @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());
    }
Run Code Online (Sandbox Code Playgroud)

我不希望没有下载和desc_new的项目。我的逻辑作品不可见,但它们留有空间。如何删除项目之间的空格。

Tus*_*aha 6

让我们深入了解回收者视图的工作原理

我们有两个函数 onCreateView 和 onBindview。由于函数的名称很容易解释 onCreateView 创建视图,而 onBindView 获取创建的视图并将数据绑定到其中

现在让我们假设整个视图类型是相似的,并且您使用对象数组或光标来填充整个视图。

所以在bindView中为了获取数据你必须使用

 cursor.moveToPosition(position)
Run Code Online (Sandbox Code Playgroud)

或者

 mList.get(position)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,绑定是根据我们从 onBindView 参数获得的位置发生的

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

所以你可以利用这些知识来专门跳过视图的绑定

假设您有一个函数接受位置作为参数并返回实际位置作为结果

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

所以你可以实现这样的东西

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

这将允许您跳过那些不显示的视图

最后在 getCount 方法中,回收器视图使用该方法来决定视图的数量

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

我希望这会有所帮助,这也将为您提供更大的灵活性,您可以添加更多过滤器并使用相同的数据集...更轻松地跳过视图


Tas*_*eni 5

有一个非常简单的解决方法:

如果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


        }

    }
Run Code Online (Sandbox Code Playgroud)

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
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。编码愉快!