【问题标题】:RecyclerView onclick doesnt workRecyclerView onclick 不起作用
【发布时间】:2017-11-21 16:40:55
【问题描述】:

我试图做到这一点,当我点击 RecyclerView 上的和项目时,它将打开新活动,其中包含所点击项目的详细信息。

我的adapter.java代码是:

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);
    }

}

}

例如,我想将“curremt.fname .......”解析为另一个活动,以向用户显示单击项目的完整详细信息。

【问题讨论】:

  • 问题解决了吗?如果没有那么我会给一个适配器..
  • 没有,还没解决
  • 检查我的适配器。我认为它会起作用..但它与你有点不同..
  • 你做到了吗……我想你做到了。
  • @O.Men 你的问题解决了吗?

标签: android android-recyclerview android-parser


【解决方案1】:

RecyclerViews 提供开箱即用的点击功能。您需要自己提供 onClick 功能。长按也是一样。

您最好让 ViewHolder 实现 View.OnClickListener 接口,并在 ViewHolder 的构造函数中将其注册为 itemView 的点击侦听器。每当调用 onClick 方法时,您都可以通过调用 getAdapterPostion() 获取该 ViewHolder 实例的位置。这将返回一个 int,指示 View 相对于 Adapters 数据集的位置。从这里您可以调用注册器自定义回调。我在我的应用程序中所做的是创建一个自定义 onItemClick 接口,该接口使用一个方法,该方法被触发并接收 int 的位置和被点击的视图。我已经修改了你的代码,给你一个可以做什么的例子。

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());
        }
    }

}

【讨论】:

  • 没有为我工作....我试图这样做: public void onClick(View v) { if(listener != null) { listener.onItemClicked(v, getAdapterPosition()); Toast.makeText(context,"fdfdfd",Toast.LENGTH_LONG); } } 并没有做吐司
  • 我尝试在点击时添加 Toast 消息,但消息没有显示
  • 我刚刚复制了你的代码并添加了这个: public void onClick(View v) { if(listener != null) { listener.onItemClicked(v, getAdapterPosition()); Toast.makeText(context,"fdfdfd",Toast.LENGTH_LONG); } }
  • @O.Men 你不应该盲目复制代码,你需要先了解我在做什么。没有注册的侦听器,因此 null 检查将始终失败,因此永远不会执行 if 块内的内容。您需要编写代码来注册 OnItemClickListener。
  • 对不起,我是新手,我明白你做了什么,但我不知道注册 OnItemClickListener 的热度...
【解决方案2】:

你可以试试..

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

【讨论】:

  • 如果您还有任何问题,请联系我..因为它对我有用..
  • 做了,但我尝试添加 Toast 消息,但没有成功,你能告诉我吗?
  • 在 itemLayoutView.setOnClickListener 你可以写 String firstName = textFirstName.getText().toString(); Toast.makeText(YourActivity.this,firstName,Toast.LENGTH_LONG).show();
【解决方案3】:

谢谢大家的帮助!

反正我刚刚加了:

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

到:public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 方法,它起作用了。

【讨论】:

  • 如果您需要复杂的与 Activity 和/或 Fragment 代码相关的 onClick 逻辑,这将不起作用。
  • 所以你是说我不能以我的方式将数据发送到另一个活动?我必须从 MyHolder 课上做吗?
  • 是的。使用这种方法,您只能使用适配器内部可用的任何数据。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多