Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Skip items in recycler view

Hi I want to skip some items from recyclerview.

here is the screenshot

Here is the bit of code

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" />

And recycler view is

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

I don't want the items that doesn't have download and desc_new. My logic works items are not visible but they leave there space. how can I remove the spaces between the items.

like image 592
Shahroz javaid Avatar asked Oct 05 '17 09:10

Shahroz javaid


People also ask

How do you swipe to delete In recycler view?

Android Swipe To Delete. Swipe to delete feature is commonly used to delete rows from a RecyclerView. In order to implement Swipe to delete feature, we need to use the ItemTouchHelper utility class.

What is nested recycler view?

A nested RecyclerView is an implementation of a RecyclerView within a RecyclerView. An example of such a layout can be seen in a variety of apps such as the Play store where the outer (parent) RecyclerView is of Vertical orientation whereas the inner (child) RecyclerViews are of horizontal orientations.


3 Answers

There's a very simple fix for this:

If you perform view.setVisibility(View.GONE); on the view while binding it to the ViewHolder, the view would be hidden but there would still be a space right where the view was supposed to be; therefore, this approach isn't efficient.

How then do we solve this problem?

All you need to do is to set the height and/or width of the view you're trying to hide to zero. Here's a simple way to achieve this:

View Holder:

    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
    }

}

I hope this helps. Merry coding!

like image 159
Taslim Oseni Avatar answered Oct 23 '22 15:10

Taslim Oseni


Lets go in depth as of how recycler view works

we have 2 functions onCreateView and onBindview. As the names of functions are quite self explaining onCreateView creates the view and onBindView takes the created view and binds data into it

now lets assume that entire view type is similar and you use an array of objects or cursor to populate the entire view.

so in bindView in order to fetch data you must have used either

 cursor.moveToPosition(position)

or

 mList.get(position)

as you can see that binding is happening based on the position that we get from onBindView arguments

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

so you can use this knowledge to specifically skip binding of view

say you have a function which accepts postion as parameter and returns actual position as result

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

so you can implement something like this

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

this will allow you to skip those view which are not to be shown

finally in method getCount which is used by recycler view to decide the number of views

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

I hope this helps this will also give your more flexibility in a way that u may add more filters and use same dataset ... skip views more easily

like image 22
Tushar Saha Avatar answered Oct 23 '22 15:10

Tushar Saha


You can remove the items from arraylist an then pass updated array list to adapter by this way you don't need to play with visibility of your views

like image 33
yogesh lokhande Avatar answered Oct 23 '22 15:10

yogesh lokhande