OnClickListener in RecyclerView in Fragment
add itemView.setOnClickListener(this);
in adapter ViewHolder
Recyclerview onclick to open new fragment
First setup a click listener:
Set a click listener on the ViewHolder
object.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {
var inflater = LayoutInflater.from(parent.context)
var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)
return AracMarkaViewHolder(arackategori).also {
arackategori.setOnClickListener { clickHandler.forwardClick(it) }
}
}
We setup a listener, where we invoke the function forwardClick(holder: AracMarkaViewHolder)
. We pass the current inflated view holder reference to it so that we can do any future operations on it.
Now setup an interface:
We create an interface because we want any click event to be handeled by the activity. Those events, in your case include, launching a new fragment.
interface ClickEventHandler {
fun forwardClick(holder: AracMarkaViewHolder)
}
Now in your adapter, setup the interface like this:
private val clickHandler: ClickEventHandler = context as ClickEventHandler
Modify adapter class signature:
Now, we need to slightly modify adapter's constructor.
var MyAdapter = AracMarkaAdapter(araclarKategori, requireContext()) //We pass the activity's context.
And your adapter class signature should look something like this:
class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>, context: Context) :
RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {
private val clickHandler: ClickEventHandler = context as ClickEventHandler
}
Implement the interface:
Now we implement the interface in the activity.
class MainActivity : AppCompatActivity(), ClickEventHandler {
override fun forwardClick(holder: AracMarkaViewHolder) {
//Launch a new fragment here.
}
}
how to passing data when clicked on item fragment with recyclerview to activity
First create a new interface anywhere like below (ClickListener.java):
interface ClickListener {
void onClickData(String value);
}
Then add it in the Adapter as a constructor parameter.
Also there is no need for the Context parameter in the Adapter (at least I haven't found any context requirement.)
However if you need context in onBindViewHolder, you should use holder.itemView.getContext()
public class NettvAdapter extends RecyclerView.Adapter<NettvAdapter.MenuItemViewHolder> {
private final List<item_kenh> recyclerViewItems;
private listener ClickListener;
public NettvAdapter(List<item_kenh> recyclerViewItems, ClickListener listener) {
this.recyclerViewItems = recyclerViewItems;
this.listener = listener;
}
@Override
public NettvAdapter.MenuItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_kenh, null);
return new MenuItemViewHolder(itemLayoutView);
}
@Override
public void onBindViewHolder(NettvAdapter.MenuItemViewHolder holder, final int position) {
final item_kenh fp = (item_kenh) recyclerViewItems.get(holder.getAdapterPosition());
//menuItemHolder.titles.setText(fp.getTitle());
// menuItemHolder.profile.setText(fp.getProfiles());
String url = fp.getUrl_images();
Picasso.get().load(url).into(holder.thumb);
holder.thumb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickData(fp.getUrl_images());
}
});
}
@Override
public int getItemCount() {
return recyclerViewItems.size();
}
public class MenuItemViewHolder extends RecyclerView.ViewHolder {
// public TextView titles;
public ImageView thumb;
// public TextView profile;
// public LinearLayout lineLayout;
MenuItemViewHolder(View itemLayoutView) {
super(itemLayoutView);
// titles = (TextView) itemLayoutView.findViewById(R.id.title);
thumb = (ImageView) itemLayoutView.findViewById(R.id.imageView);
//profile = (TextView) itemLayoutView.findViewById(R.id.profiles);
//lineLayout = (LinearLayout) itemLayoutView.findViewById(R.id.midlelayout);
}
}
Then implement ClickListener
in your Fragment:
Tab1_Fragment extends Fragment implements ClickListener {
@Override
void onClickData(String clickedValue) {
Intent int_detail = new Intent(getContext(), PlayerActivity.class);
int_detail.putExtra("url_img", clickedValue);
getActivity().startActivity(int_detail);
}
}
And initialise your Adapter same as before:mAdapter = new NettvAdapter(mRecyclerViewItems, this);
Different onClick for each and every Recyclerview item
You should use if condition in onBindViewHolder of your adpter class as bellow:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.item.setOnClickListener {
when (position) {
0 -> {
//navigate to first fragment}
}
1 -> {
//navigate to second fragment}
}
2 -> {
//navigate to third fragment}
}
3 -> {
//navigate to fourth fragment}
}
}
}
}
Related Topics
Download a File Programmatically on Android
Play Store Alpha Test Download Link Not Working
Android Studio - Failed to Apply Plugin [Id 'Com.Android.Application']
Sending Files Using Post With Httpurlconnection
Retrofit 2.0 - How to Get Response Body for 400 Bad Request Error
How to Send a Firebase Notification to All Devices Via Curl
How to Edit Files Inside the Android Adb Shell
Install_Failed_User_Restricted:Android Studio Using Redmi 4 Device
How Remove Unnecessary Space Between Cards in Recyclerview
How to Open Whatsapp Using an Intent in Your Android App
Android - Transform Classes With Dex for Debug
Android Check Null or Empty String in Android
Install Apps Silently, With Granted Install_Packages Permission
Android Adb Doesn't See Device
How to Close All Activities and Exit from an App
How to Get the Current Time on a Button Click
How to Get the Height of Recyclerview Item in "Onbindviewholder"