在回收站视图中跳过项目

时间:2017-10-05 09:48:06

标签: android layout android-recyclerview recyclerview-layout

您好我想跳过recyclerview的一些内容。

here is the screenshot

以下是代码

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的项目。我的逻辑工作项目不可见,但他们留下了空间。如何删除项目之间的空格。

7 个答案:

答案 0 :(得分:3)

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

如果在将视图绑定到ViewHolder时在视图上执行view.setVisibility(View.GONE);,则该视图将被隐藏,但该视图原应位于该位置; 因此,这种方法效率不高

那我们该如何解决这个问题?

您需要做的就是将要隐藏的视图的高度和/或宽度设置为零。这是实现此目的的简单方法:

查看持有人:

    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
    }

}

我希望这会有所帮助。快活的编码!

答案 1 :(得分:2)

让我们深入了解回收者的观点如何运作

我们在onCreateView和onBindview上有2个函数。由于函数的名称非常自我解释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
 }

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

答案 2 :(得分:1)

您可以从arraylist中删除项目,然后通过这种方式将更新的数组列表传递给适配器,这样您就不需要看到您的视图的可见性

答案 3 :(得分:0)

通过制作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);
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您需要设置持有者的可见性,而不是您的观点。

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

答案 6 :(得分:0)

你应该使用 View.GONE 而不是 View.INVISIBLE

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