Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 单击RecyclerView项目时,有几个项目会起作用_Android_Android Recyclerview - Fatal编程技术网

Android 单击RecyclerView项目时,有几个项目会起作用

Android 单击RecyclerView项目时,有几个项目会起作用,android,android-recyclerview,Android,Android Recyclerview,我使用RecycleView创建了一个列表。我想当点击其中一个项目时,该项目会起作用。但除此之外,其他几个项目也起作用。 我在onBindViewHolder中使用了setOnClickListener 我怎样才能解决这个问题 适配器类: public class adapter extends RecyclerView.Adapter<adapter.viewholder> { private List<MyListModel> myListModels; Cont

我使用
RecycleView
创建了一个列表。我想当点击其中一个项目时,该项目会起作用。但除此之外,其他几个项目也起作用。 我在
onBindViewHolder
中使用了
setOnClickListener

我怎样才能解决这个问题

适配器类:

public class adapter extends RecyclerView.Adapter<adapter.viewholder> {


private List<MyListModel> myListModels;
Context context;

public adapter(List<MyListModel> myListModels, Context context)
{
    this.context=context;
    this.myListModels = myListModels;
}

@NonNull
@Override
public adapter.viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
    return new viewholder(view);
}

@Override
public void onBindViewHolder(@NonNull final adapter.viewholder holder, int position) {
    MyListModel myListModel = myListModels.get(position);

    holder.name.setText(myListModel.getName());

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

            holder.relativeLayout.animate().alpha(1f).setDuration(700).start();

        }
    });
}

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

class viewholder extends RecyclerView.ViewHolder  {

    TextView name;
    RelativeLayout relativeLayout;
    CardView cardView;

    public viewholder(@NonNull View itemView) {
        super(itemView);
        name = itemView.findViewById(R.id.products_list_name);
        cardView = itemView.findViewById(R.id.products_list_cardview);
        relativeLayout = itemView.findViewById(R.id.products_list_relativeLayout);
    }
}
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    List<MyListModel> myListModel = new ArrayList<>();
    for(int i=0;i<=20;i++)
    myListModel.add(new MyListModel("item "+i));


    RecyclerView recyclerView=findViewById(R.id.Recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter Adapter = new adapter(myListModel,this);
    recyclerView.setAdapter(Adapter);

}}

公共类适配器扩展了RecyclerView.adapter

RecyclerView重用视图。这就是为什么会出现这个问题

MyListModel
class中添加
boolean b
变量,并在
OnBindViewHolder中单击并设置此代码时设置为true

if(!b)
holder.relativeLayout.setVisibility(GONE);
else holder.relativeLayout.setVisibility(VISIBLE);

不要将onClick listener置于
onBindViewHolder
上,因为它会将其设置为要绑定的每个值,每次滚动时内存使用都会增加,如果有大量数据,则应用程序会延迟,因此,在您想要的任何视图上设置
viewholder
上的click listener,并在需要时使用界面传递值。按照Pemba提到的方法,在onBindViewHolder中设置click listener是不好的做法。相反,将clickListener放在viewHolder中,并相对于itemPosition设置项目动画。