Android RecycleView with OnClickListener
Android RecyclerView is more than flexible more than android ListView. It is a container for rendering larger data set of views that can be recycled and scrolled very efficiently. RecyclerView is like traditional ListView, but with more flexibility to customizes and optimized to work with larger datasets.
Example of Android RecyclerView
First, add the following android support library dependency to project build.graddle file.
dependencies { compile 'com.android.support:recyclerview-v7:25.0.1' compile 'com.android.support:cardview-v7:25.0.1' }
First, dependency for RecyclerView and Second is for CardView. We use cardView in Recyclerview row item layout file. now use below code to your layout file
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_recyView"/>
Now go to your java class file and use below code.
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.main_recyView); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //setting layout manager recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setNestedScrollingEnabled(false);
Here I use LinearLayoutManager and vertically scroll options. you can use another layout manager. Now create an Adapter of android RecyclerView. we also need ViewHolder Class. you can create this ViewHolder class in a separate class or in the child class of Adapter class. I create ViewHolder class in the Adapter class. in adapter class, we need two variables
- ArrayList
- Context
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:elevation="10dp" android:padding="10dp"> <TextView android:id="@+id/main_card_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="10dp" android:text="@string/app_name" android:textSize="20sp"/> </android.support.v7.widget.CardView>we also need Item type class. My class name is SubjectList.java you can change your choice. SubjectList.java code is
public class SubjectList { private String subName; public SubjectList(String subName) { this.subName = subName; } public String getSubName() { return subName; } }
Now adapter class
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> { //Array list private ArrayList<SubjectList> objects; //context private Context context; //view holder class class MainViewHolder extends RecyclerView.ViewHolder { TextView textView; private MainViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.main_card_tv); } } //constructor public MainAdapter(ArrayList<SubjectList> objects, Context context) { this.objects = objects; this.context = context; } @Override public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.main_card_view,parent,false); return new MainViewHolder(view); } @Override public void onBindViewHolder(final MainViewHolder holder, int position) { final SubjectList list = objects.get(position); holder.textView.setText(list.getSubName()); holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { context.startActivity(new Intent(context, LocationActivity.class)); } }); } @Override public int getItemCount() { return objects.size(); } }
RecyclerView OnclickListener
we add a listener in onBindViewHolder method. the code here-@Override public void onBindViewHolder(final MainViewHolder holder, int position) { final SubjectList list = objects.get(position); holder.textView.setText(list.getSubName()); holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { context.startActivity(new Intent(context, LocationActivity.class)); } }); holder.textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; } }); }Note: If you have multiple views in Recyclerview row item layout file you can use Card view to setOnClickListener instead of Textview.
Code analysis
ViewHolder Class-- we make ViewHolder class extend of RecyclerView.ViewHolder
- we have on TextView and we cast it.
- we initialize our two variables through constructor
- in onCreateViewHolder methods we create a new view type that inflates a layout file through LayoutInflater and returns new ViewHolder class with a parameter with that’s view.
- we create new SubjectList and initialize it through the position of the ArrayList item.
- add set Text to View by getting getter method of SubjectList.
- now setOnClickListener to the view
- in final we just return the size of ArrayList in getItemCount() method.
No comments :