Sunday, February 18, 2018

Autofit Recyclerview

Autofit Recyclerview  is used to show number of column which can be auto adjust with screen size. you can see it in this tutorial.





Steps to use Autofit Recyclerview in your project.

  1. Crate a project(Autofit Recyclerview Demo) in android studio.

  2. Create a Activity AutoFitGridRecyclerView.Java and update it-
    
    

    package com.pankaj.autofitrecyclerviewdemo;
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    /**
     * Created by gsolc on 5/2/18.
     */
    public class AutoFitGridRecyclerView extends RecyclerView {
        private GridLayoutManager manager;
        private int columnWidth = -1;
    
        public AutoFitGridRecyclerView(Context context) {
            super(context);
            initialization(context, null);
        }
    
        public AutoFitGridRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initialization(context, attrs);
        }
    
        public AutoFitGridRecyclerView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            initialization(context, attrs);
        }
    
        private void initialization(Context context, AttributeSet attrs) {
            if (attrs != null) {
                // list the attributes we want to fetch
                int[] attrsArray = {
                        android.R.attr.columnWidth
                };
                TypedArray array = context.obtainStyledAttributes(attrs, attrsArray);
                //retrieve the value of the 0 index, which is columnWidth
                columnWidth = array.getDimensionPixelSize(0, -1);
                array.recycle();
            }
            manager = new GridLayoutManager(context, 1);
            setLayoutManager(manager);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            return super.dispatchTouchEvent(ev);
        }
    
        @Override
        protected void onMeasure(int widthSpec, int heightSpec) {
            super.onMeasure(widthSpec, heightSpec);
            if (columnWidth > 0) {
                //The spanCount will always be at least 1
                int spanCount = Math.max(1, getMeasuredWidth() / columnWidth);
                manager.setSpanCount(spanCount);
            }
        }
    }
    
     
  3. Create a class Data.java to hold data and update it-

    package com.pankaj.autofitrecyclerviewdemo;
    /**
     * Created by gsolc on 5/2/18.
     *
     * data model to hold data
     */
    
    public class Data {
        private String name;
        private String contact;
        public Data(String name, String contact) {
            this.name = name;
            this.contact = contact;
        }
    
        public Data() {
        }
    
        public String getName() {
            return name;
        }
    
        public String getContact() {
            return contact;
        }
    }
    
    
    
     
  4. Create a class MyAdapter.Java and update it-

    package com.pankaj.autofitrecyclerviewdemo;
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import java.util.List;
    /**
     * Created by gsolc on 5/2/18.
     */
    
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        private List<Data> data;
        private Context context;
        public MyAdapter(List<Data> data, Context context) {
            this.data = data;
            this.context = context;
        }
    
        @Override
        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            View view1 = inflater.inflate(R.layout.item, parent, false);
            ViewHolder viewHolder = new ViewHolder(view1);
            return viewHolder;
        }
    
        @Override
        public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
            holder.tvName.setText(data.get(position).getName());
            holder.tvContact.setText(data.get(position).getContact());
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView tvName, tvContact;
            public ViewHolder(View itemView) {
                super(itemView);
                tvContact = itemView.findViewById(R.id.tvContact);
                tvName = itemView.findViewById(R.id.tvName);
            }
        }
    }
    
    
     
  5. Create a activity MainActivity.Java and update it-

    package com.pankaj.autofitrecyclerviewdemo;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.RecyclerView;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //create and initialize recycler view object
            RecyclerView  recyclerView = findViewById(R.id.recyclerView);
    
            //create dummy data to show in list
            List<Data> data = new ArrayList<>();
            for (int i = 10; i <= 100; i++)
                data.add(new Data("Name " + i, "9876543" + i));
    
            //create object of adapter and initialize it
            MyAdapter adapter = new MyAdapter(data, this);
    
            //if you want to use autofitgridview then no need to add layout manager
            //But for the simple verticle/horizontal list its required
            //LinearLayoutManager manager = new LinearLayoutManager(this);
            //LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
            //GridLayoutManager manager = new GridLayoutManager(this, 2);
            //recyclerView.setLayoutManager(manager);
            //set adapter
    
            recyclerView.setAdapter(adapter);
        }
    }
    
    
     

  6. Create a xml activity_main.xml and update it-

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.pankaj.autofitrecyclerviewdemo.MainActivity">
    
        <!--only one parameter is required to show autofit column is columnWidth -->
        <com.pankaj.autofitrecyclerviewdemo.AutoFitGridRecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnWidth="100dp" />
    </android.support.constraint.ConstraintLayout>
    
    
    
    
     
  7. Create a xml item.xml for adapter row and update it-

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">
    
        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:transitionName="@string/app_name" />
    
        <TextView
            android:id="@+id/tvContact"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:transitionName="@string/app_name" />
    </LinearLayout>
    
    
     
  8. All the application development process with Auto fit Recycler View has completed, Now run the app and look the screen.
    Note :
    Now change your device mode to portrait.


  9. Now change your device mode to landscape





  10. Good bye, Thanks to read this blog.

1 comment:

  1. I love your auto column fit but I want the layout to be like staggered but have the auto future. Please replay back thank you

    ReplyDelete