RecyclerView onClick 给出错误的项目

Dio*_*Pic 1 java android android-recyclerview

我有一个RecyclerView显示学生详细信息的列表。我面临的问题是当我单击第一项时,它会返回第二项的数据。我相信这与 有关getAdapterPosition(),但我不确定。

在这种情况下,它会在选择第一个学生时返回第二个学生(项目)的卷号。

任何帮助表示赞赏


回收器视图适配器

public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.ViewHolder> {
    Context context;
    public List<StudentDataModel> dataModels;
    public StudentDataModel dataAdapter;

    public StudentAdapter(List<StudentDataModel> getDataAdapter, Context context){
        super();
        this.dataModels = getDataAdapter;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.student, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final StudentAdapter.ViewHolder viewHolder, final int position) {
        dataAdapter =  dataModels.get(position);        
        viewHolder.NameStudentCard.setText(dataAdapter.getName());
        viewHolder.RankStudentCard.setText(dataAdapter.getRank());
        viewHolder.RollStudentCard.setText(dataAdapter.getRoll());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                notifyDataSetChanged();                
                Toast.makeText(v.getContext(), "Tapped on" + dataAdapter.getRoll(), Toast.LENGTH_SHORT).show(); //Here it returns the Roll No. of the second student(item) in the recyclerView.                
                Intent intent = new Intent (v.getContext(), StudentDetailsActivity.class);                
                v.getContext().startActivity(intent);
            }
        });

    }

    class ViewHolder extends RecyclerView.ViewHolder{
        public TextView NameStudentCard;
        public TextView RankStudentCard;
        public TextView RollStudentCard;

        public ViewHolder(View itemView) {
            super(itemView);
            NameStudentCard=(TextView)itemView.findViewById(R.id.textViewName);
            RankStudentCard=(TextView)itemView.findViewById(R.id.textViewRank);
            RollStudentCard =(TextView)itemView.findViewById(R.id.textViewEmployeeID);

        }
    }

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

}
Run Code Online (Sandbox Code Playgroud)

Neh*_*haK 5

是的,因为您将对象声明为全局对象。所以它正在使用最后一个可见行的对象进行更新,因为 onBindViewHolder()按顺序为每个可见行调用。因此,它仅适用于最后一个可见行。

所以你需要在方法中声明它:

评论这个:

   // public StudentDataModel dataAdapter;
Run Code Online (Sandbox Code Playgroud)

在这里声明:

@Override
public void onBindViewHolder(final StudentAdapter.ViewHolder viewHolder, final int position) {

   final StudentDataModel dataAdapter =  dataModels.get(position); // add this here

}
Run Code Online (Sandbox Code Playgroud)