Android — RecyclerView and Volley

Re usability of code is the need of the hour. RecyclerView that was introduced by google helps us populate data in custom lists.

Google’s card UI enforces recycler view. It is relatively simple once you get a hang of it.

Volley is an HTTP library that makes the process of fetching JSONs faster and with minimal or no memory leaks.

You can watch the video for a brief on Volley.

We add the following to the build.gradle file of the app

dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile "com.android.support:recyclerview-v7:23.0.1"
compile 'com.android.volley:volley:1.0.0'
}

Now in the res file of the main activity or the file you want to populate the recycler view add the following

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical" />

Then we create a model class for an object that can encompass the datas we get from json

Let’s say we need each card to display a picture and a text of a movie.

We create a model class called DoctorList.

public class DoctorList {

    String DoctorName;
    String Rating;
    String Qualification;
    String Experience;
    String Specialization;

    public String getDoctorName() {
        return DoctorName;
    }

    public void setDoctorName(String doctorName) {
        DoctorName = doctorName;
    }

    public String getRating() {
        return Rating;
    }

    public void setRating(String rating) {
        Rating = rating;
    }

    public String getQualification() {
        return Qualification;
    }

    public void setQualification(String qualification) {
        Qualification = qualification;
    }

    public String getExperience() {
        return Experience;
    }

    public void setExperience(String experience) {
        Experience = experience;
    }

    public String getSpecialization() {
        return Specialization;
    }

    public void setSpecialization(String specialization) {
        Specialization = specialization;
    }

}

In DoctorListViewAdapter.java  we add the following:-

public class DoctorListViewAdapter extends RecyclerView.Adapter<DoctorListViewAdapter.ViewHolder> {

    Context context;
    RecyclerViewItemClickInterface recyclerViewItemClickInterface;
    callnowInterface anInterface;
    List<DoctorList> doctorList;
    public DoctorListViewAdapter(List<DoctorList> doctorList, Context context)
    {
        super();
        this.doctorList=doctorList;
        this.context = context;
        recyclerViewItemClickInterface =(RecyclerViewItemClickInterface) context;
        anInterface =(callnowInterface)context;

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.doctor_list, parent, false);
        ViewHolder viewHolder= new ViewHolder(v);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position)
    {
        DoctorList doctorList1 =  doctorList.get(position);

        holder.Doctorname.setText(doctorList1.getDoctorName());
        holder.Qulifications.setText(doctorList1.getQualification());
        holder.recyclerid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String name = doctorList.get(position).getDoctorName();
                String experince = doctorList.get(position).getExperience();
                String qualification = doctorList.get(position).getQualification();
                String rating = doctorList.get(position).getRating();
                String specialization = doctorList.get(position).getSpecialization();
                Intent intent = new Intent(context, DoctorProfileActivitty.class);
                intent.putExtra("name",name);
                intent.putExtra("experince",experince);
                intent.putExtra("qualification",qualification);
                intent.putExtra("rating",rating);
                intent.putExtra("specialization",specialization);
                context.startActivity(intent);
            }
        });
        holder.bookappntment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                String name = doctorList.get(position).getDoctorName();
                String experince = doctorList.get(position).getExperience();
                String qualification = doctorList.get(position).getQualification();
                String rating = doctorList.get(position).getRating();
                String specialization = doctorList.get(position).getSpecialization();
                Intent intent = new Intent(context, BookAppoimnetActivity.class);
                intent.putExtra("name",name);
                intent.putExtra("experince",experince);
                intent.putExtra("qualification",qualification);
                intent.putExtra("rating",rating);
                intent.putExtra("specialization",specialization);
                context.startActivity(intent);
                //recyclerViewItemClickInterface.itemClick(doctorList.get(position));
            }
        });
        holder.callnow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                anInterface.itemClickk(doctorList.get(position));
            }
        });

    }
    @Override
    public int getItemCount() {
        return doctorList.size();
    }
     class ViewHolder extends RecyclerView.ViewHolder
     {
         public LinearLayout recyclerid;
         public TextView Doctorname;
         public TextView Qulifications;
         public TextView experince;
         public TextView bookappntment;
         public TextView callnow;

         public ViewHolder(View itemView)
         {
             super(itemView);
             Doctorname = (TextView) itemView.findViewById(R.id.personName) ;
             Qulifications = (TextView) itemView.findViewById(R.id.qulification) ;
             bookappntment=(TextView)itemView.findViewById(R.id.bookappntment);
             callnow=(TextView)itemView.findViewById(R.id.call);
             recyclerid=(LinearLayout)itemView.findViewById(R.id.recyclerid);


             /*experince = (TextView) itemView.findViewById(R.id.textView6) ;
             Specialization = (TextView) itemView.findViewById(R.id.textView8) ;
             Rating = (TextView) itemView.findViewById(R.id.textView8) ;*/
         }
     }
}

 

rowlistview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/recyclerid"
    android:background="@color/transparent2"
    android:gravity="center_vertical"
    android:orientation="vertical">

    <LinearLayout
        android:padding="4dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:weightSum="5">

        <LinearLayout
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:gravity="center"
            android:layout_gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/imgPerson"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@drawable/usericon" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">

            <TextView
                android:id="@+id/personName"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="@dimen/margin10"
                android:gravity="center_vertical"
                android:text="Person"
                android:textColor="@color/black"
                android:textSize="16dp"
                android:textStyle="normal" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="@dimen/margin10"
                android:gravity="center_vertical"
                android:text="MBBS"
                android:id="@+id/qulification"
                android:layout_marginTop="3dp"
                android:textColor="@color/black"
                android:textSize="14dp"
                />
            <TextView
                android:id="@+id/userid"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="@dimen/margin10"
                android:gravity="center_vertical"
                android:text="6 Year Exp."
                android:visibility="gone"
                android:textColor="@color/black"
                android:textSize="14dp"
                android:textStyle="normal" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1.2"
           android:layout_marginTop="17dp"
            >
            <!-- <CheckBox
                 android:id="@+id/cbSelectedItem"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginRight="@dimen/margin5"
                 android:button="@drawable/check_box"
                 android:focusable="false"
                 android:visibility="visible" />-->


            <ImageView
                android:visibility="gone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="@dimen/margin10"
                android:gravity="center_horizontal"
                android:src="@drawable/ic_keyboard_arrow_right_black_24dp" />

        </LinearLayout>
    </LinearLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="@dimen/margin0.5"
        android:layout_marginLeft="@dimen/margin10"

        android:layout_marginRight="@dimen/margin10"
        android:background="@color/white2"
        android:visibility="gone" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_marginLeft="10dp"
        android:layout_height="wrap_content"
        android:weightSum="1">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Call now"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:paddingTop="2dp"
            android:paddingBottom="2dp"
            android:layout_marginRight="23dp"
            android:textSize="14dp"
            android:textStyle="bold"

            android:background="@drawable/borderview"
            android:textColor="@color/heading_theme_light"
            android:id="@+id/call" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Book Appointment"
            android:textSize="14dp"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:paddingTop="2dp"
            android:paddingBottom="2dp"
            android:background="@drawable/borderview"
            android:id="@+id/bookappntment"
            android:textColor="@color/heading_theme_light"
            android:textStyle="bold"
             />

    </LinearLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="4dp"
/>

</LinearLayout>

 

*)DoctorListActivity.java

public class DoctorListActivity extends Activity implements RecyclerViewItemClickInterface,callnowInterface {

    private static final String DoctorList_URL ="http://ada.tecboot.com/api/WebAPI/GetDoctor";
    RecyclerView recyclerView;
    RecyclerView.LayoutManager recyclerViewlayoutManager;
    RecyclerView.Adapter recyclerViewadapter;
    List<DoctorList> doctorList;
    private LinearLayout llBack;
    Context context;
     Dialog dialog;
    TextView txtAddPeople;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_doctor_list);
        try {
            llBack = (LinearLayout) findViewById(R.id.llBack);
            llBack.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                    overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
                }
            });
            txtAddPeople=(TextView)findViewById(R.id.txtAddPeople);
            txtAddPeople.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Collections.sort(doctorList, new Comparator<DoctorList>() {
                        @Override
                        public int compare(DoctorList lhs, DoctorList rhs) {
                            // TODO Auto-generated method stub

                            String f1 = lhs.getDoctorName();
                            String f2 = rhs.getDoctorName();
                            recyclerViewadapter.notifyDataSetChanged();
                            return f1.compareTo(f2);



                        }
                    });

                }
            });
            dialog = new Dialog (this);
            doctorListApiCall();
            doctorList = new ArrayList<>();
            recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);
            recyclerView.setHasFixedSize(true);

            recyclerViewlayoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(recyclerViewlayoutManager);
            DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
            divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider));
            recyclerView.addItemDecoration(divider);
            recyclerViewadapter = new DoctorListViewAdapter(doctorList, this);
            recyclerView.setAdapter(recyclerViewadapter);
        }catch (Exception e)
        {

        }
    }
    @Override
    public void itemClick(Object object) {
        Intent intent = new Intent(DoctorListActivity.this,BookAppoimnetActivity.class);
        startActivity(intent);
    }

    @Override
    public void itemClickk(Object object) {
                showDeleteDialog();
    }

    private void showDeleteDialog()
    {
        final Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.calldialog);

        TextView text = (TextView) dialog.findViewById(R.id.txtMsg);
        Button okButton = (Button) dialog.findViewById(R.id.btnOk);
        Button cancleButton = (Button) dialog.findViewById(R.id.btnCancel);
       // final EditText edittext_tv = (EditText) dialog.findViewById(R.id.editText);

        okButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog.dismiss();

            }
        });
        cancleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }
    private void doctorListApiCall()
    {
        try {
            dialog.requestWindowFeature (Window.FEATURE_NO_TITLE);
            dialog.setContentView (R.layout.custom_progress_dialog_trans);
            dialog.getWindow ().setBackgroundDrawableResource (android.R.color.transparent);
            dialog.show ();
            StringRequest stringRequest = new StringRequest(Request.Method.POST, DoctorList_URL,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response)
                        {
                            getJsonResponse(response);
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error)
                        {
                            Toast.makeText(DoctorListActivity.this, error.toString(), Toast.LENGTH_LONG).show();
                        }
                    }) {
                @Override
                protected Map<String, String> getParams()
                {

                    Map<String, String> params = new HashMap<String, String>();
                    params.put("DisplayType", "Grid");
                    return params;
                }
            };

            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void getJsonResponse(String response)
    {
        try {
            dialog.dismiss();
            JSONArray jsonArray = new JSONArray(response);
            for(int i = 0;i<jsonArray.length();i++)
            {
                DoctorList doctorList1 = new DoctorList();
                String strDoctorName = jsonArray.getJSONObject(i).getString("DoctorName");
                String strRating = jsonArray.getJSONObject(i).getString("Rating");
                String strSpecialization = jsonArray.getJSONObject(i).getString("Specialization");
                String strExperience = jsonArray.getJSONObject(i).getString("Experience");
                String  strQualification = jsonArray.getJSONObject(i).getString("Qualification");
                doctorList1.setDoctorName(strDoctorName);
                doctorList1.setRating(strRating);
                doctorList1.setExperience(strExperience);
                doctorList1.setSpecialization(strSpecialization);
                doctorList1.setQualification(strQualification);
                doctorList.add(doctorList1);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        recyclerViewadapter.notifyDataSetChanged();
    }
}

Interface:

1)
public interface callnowInterface {
    public void itemClickk(Object object);
}
2)
public interface RecyclerViewItemClickInterface {
    public void itemClick(Object object);
}