Teo Albano
Teo Albano

Reputation: 183

RecyclerView Single Item ID

Ehi, i'm modding an example app i found on the Internet. (learn2crack) I want to get the ID of a single row in my ReclycerView. Here's the code.

Main

    private void initViews(){
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(layoutManager);

    ArrayList<AndroidVersion> androidVersions = prepareData();
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
    recyclerView.setAdapter(adapter);
    recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener(){

        @Override
        public void onTouchEvent(RecyclerView recycler, MotionEvent event) {
            Toast.makeText(getApplicationContext(),"Here i need the ID of the clicked row",Toast.LENGTH_SHORT).show();
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView recycler, MotionEvent event) {
            return true;
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean a){

        }

    });

}
private ArrayList<AndroidVersion> prepareData(){

    ArrayList<AndroidVersion> android_version = new ArrayList<>();
    for(int i=0;i<android_version_names.length;i++){
        AndroidVersion androidVersion = new AndroidVersion();
        androidVersion.setAndroid_version_name(android_version_names[i]);
        androidVersion.setAndroid_image_url(android_image_urls[i]);
        android_version.add(androidVersion);
    }
    return android_version;
}

Adapter

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<AndroidVersion> android_versions;
private Context context;


public DataAdapter(Context context,ArrayList<AndroidVersion> android_versions) {
    this.context = context;
    this.android_versions = android_versions;

}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int i) {

    viewHolder.tv_android.setText(android_versions.get(i).getAndroid_version_name());
    Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android);
    viewHolder.tv_android.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View argi) {
            //Toast.makeText(context,String.valueOf(i),Toast.LENGTH_SHORT).show();

        }
    });

}

@Override
public int getItemCount() {
    return android_versions.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    TextView tv_android;
    ImageView img_android;
    public ViewHolder(View view) {
        super(view);

        tv_android = (TextView)view.findViewById(R.id.tv_android);
        img_android = (ImageView)view.findViewById(R.id.img_android);
    }
}

As you can see, i did some change. The beahviour i'm trying to implemente is this: When i click on one of the ReclyclerView button i want to print its "id"(the same thing i used in the adapter, that now is behind comment. I want to Load a different recyclerview for every click / category. So i'm gonna need a switch-case, but ofc i need to get every single ID from the recyclerview. If i use the "adapter version" it works, every click displays "1", "2" and so on. But i need this to work on main, so i can call InitViews() again, or call a modified version of it. I'm looking for something like: int id1=recycleritem.getid(); Any idea? Thanks in advance.

Upvotes: 1

Views: 838

Answers (2)

J Anand Boss
J Anand Boss

Reputation: 136

Create an interface called ItemClickListener

public interface ItemClickListener {
    void onClick(int position);
}

Implement this interface in your activity, and keep a reference of adapter input

private ArrayList<AndroidVersion> android_version;

....
....

@Override
public void onClick(int position) {
    AndroidVersion version = android_version.get(position);
    // do your task with retrieved AndroidVersion
}

Change the adapter constructor like below

new DataAdapter(getApplicationContext(),androidVersions, itemClickListener);

Inside the DataAdapter class

viewHolder.tv_android.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View argi) {
            //Toast.makeText(context,String.valueOf(i),Toast.LENGTH_SHORT).show();
            if(itemClickListener != null) {
                itemClickListener.onClick(i);
            }
        }
    });

Upvotes: 0

Kuffs
Kuffs

Reputation: 35661

Don't use the OnTouch event on the RecyclerView itself.

Set up an OnClick on the view in onBindViewHolder. When it is fired, call back to the Activity with the row of the touched item.

Create the adapter with the interface

    MyAdapter adp=new MyAdapter(new MyAdapter.InterfaceCommands() {
        @Override
        public void OnItemPressed(int position) {
            // do something
        }
    });

Incomplete Example Adapter.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> {

    public MyAdapter(InterfaceCommands i) {
        MyCommands = i;
    }

    public interface InterfaceCommands {

        public void OnItemPressed(int position);

    }

    private InterfaceCommands MyCommands;

    @Override
    public void onBindViewHolder(final MyAdapter.VH holder, final int position) {

        // Set Up ViewHolder pattern
        // ....

        holder.containerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int position = holder.getAdapterPosition();

                MyCommands.OnItemPressed(position);

            }
        });

    }

}

Upvotes: 1

Related Questions