简体   繁体   中英

RecyclerView onclick doesnt work

im trying to make that when im clicking and item on the RecyclerView , it will open new activity with the details of the clicked item.

my adapter.java code is :

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

private Context context;
private LayoutInflater inflater;
List<UsersData> data= Collections.emptyList();
UsersData current;
int currentPos=0;

// create constructor to innitilize context and data sent from MainActivity
public AdapterUsersData(Context context, List<UsersData> data){
    this.context=context;
    inflater= LayoutInflater.from(context);
    this.data=data;
}

// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=inflater.inflate(R.layout.container_users, parent,false);
    MyHolder holder=new MyHolder(view);
    return holder;
}

// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    // Get current position of item in recyclerview to bind data and assign values from list
    final MyHolder myHolder= (MyHolder) holder;
    final UsersData current=data.get(position);
    myHolder.textFirstName.setText("First Name: " + current.fname);
    myHolder.textPassword.setText("Pass: " + current.password);
    myHolder.textLastName.setText("Last Name: " + current.lname);
    myHolder.textEmail.setText("Email. " + current.email);


}

// return total item from List
@Override
public int getItemCount() {
    return data.size();
}


class MyHolder extends RecyclerView.ViewHolder{

    TextView textFirstName;
    TextView textPassword;
    TextView textLastName;
    TextView textEmail;

    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        textFirstName= (TextView) itemView.findViewById(R.id.textFirstName);
        textPassword = (TextView) itemView.findViewById(R.id.textPassword);
        textLastName = (TextView) itemView.findViewById(R.id.textLastName);
        textEmail = (TextView) itemView.findViewById(R.id.textEmail);
    }

}

}

For example i want to parse the "curremt.fname ......." to another activity to show the clicked item full details to the user.

RecyclerViews provide an onclick functionality out o the box. You need to provide onClick functionality yourself. Same goes for long pressing.

You would ideally make your ViewHolder implement the View.OnClickListener interface and inside of the ViewHolder's constructor you'd register it as itemView's click listener. Whenever the onClick method gets called you can get the position of that ViewHolder instance by calling getAdapterPostion(). Which will return an int that indicates the position of the View relative to the Adapters data set. From here you can call a regisster custom callback. What I've done in my app, is create a custom onItemClick interface with a method that gets fired and receives the position of the int and the view that was clicked. I've modified you code to give you an example of what you can do.

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

private Context context;
private LayoutInflater inflater;
List<UsersData> data= Collections.emptyList();
UsersData current;
int currentPos=0;

// create constructor to innitilize context and data sent from MainActivity
public AdapterUsersData(Context context, List<UsersData> data){
    this.context=context;
    inflater= LayoutInflater.from(context);
    this.data=data;
}

// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=inflater.inflate(R.layout.container_users, parent,false);
    MyHolder holder=new MyHolder(view);
    return holder;
}

// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    // Get current position of item in recyclerview to bind data and assign values from list
    final MyHolder myHolder= (MyHolder) holder;
    final UsersData current=data.get(position);
    myHolder.textFirstName.setText("First Name: " + current.fname);
    myHolder.textPassword.setText("Pass: " + current.password);
    myHolder.textLastName.setText("Last Name: " + current.lname);
    myHolder.textEmail.setText("Email. " + current.email);


}

// return total item from List
@Override
public int getItemCount() {
    return data.size();
}

public interface OnItemClickListener {
    void onItemClicked(View v, int position);
}

private OnItemClickListener listener;


class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView textFirstName;
    TextView textPassword;
    TextView textLastName;
    TextView textEmail;

    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        textFirstName= (TextView) itemView.findViewById(R.id.textFirstName);
        textPassword = (TextView) itemView.findViewById(R.id.textPassword);
        textLastName = (TextView) itemView.findViewById(R.id.textLastName);
        textEmail = (TextView) itemView.findViewById(R.id.textEmail);
    }

    public void onClick(View v) {
        if(listener != null) {
            listener.onItemClicked(v, getAdapterPosition());
        }
    }

}

You can try..

class dapterUsersData extends RecyclerView.Adapter<dapterUsersData.ViewHolder> {

    private Context context;
    private LayoutInflater inflater;
    List<UsersData> data =  Collections.emptyList();
    ArrayList<UsersData> dataSet;

    public dapterUsersData(ArrayList<UsersData> data) {
        this.data = data;
    }


    @Override
    public dapterUsersData.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.container_users, null);
        itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));


        dapterUsersData.ViewHolder viewHolder = new dapterUsersData.ViewHolder(itemLayoutView);

        return viewHolder;
    }

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

        UsersData current = data.get(i);

        viewHolder.textFirstName.setText("First Name: " + current.getFname());
        viewHolder.textPassword.setText("Pass: " + current.getPassword());
        viewHolder.textLastName.setText("Last Name: " + current.getLname());
        viewHolder.textEmail.setText("Email. " + current.getEmail());

        viewHolder.menu = current;
    }

    @Override
    public int getItemCount() {

        return dataSet.size();
    }

    public void updateList(List<UsersData> temp) {
        dataSet = (ArrayList<UsersData>) temp;
        notifyDataSetChanged();
    }

    // inner class to hold a reference to each item of RecyclerView
    public  class ViewHolder extends RecyclerView.ViewHolder {

        TextView textFirstName;
        TextView textPassword;
        TextView textLastName;
        TextView textEmail;




        public UsersData menu;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);

            textFirstName= (TextView) itemLayoutView.findViewById(R.id.textFirstName);
            textPassword = (TextView) itemLayoutView.findViewById(R.id.textPassword);
            textLastName = (TextView) itemLayoutView.findViewById(R.id.textLastName);
            textEmail = (TextView) itemLayoutView.findViewById(R.id.textEmail);


            itemLayoutView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //  OnClick
                    String firstName = textFirstName.getText().toString();

                }
            });

        }

    }
}
//end Adapter

Thank you guys for the help!

anyway i just added :

 myHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context,current.fname.toString(),Toast.LENGTH_LONG).show();
        }
    });

To the : public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) method , and it worked.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM