RecyclerView onBindViewHolder onclicklistener行为

时间:2015-05-20 00:30:38

标签: android android-recyclerview android-cardview android-viewholder

我正在尝试加载列出卡片的回收者视图,每张卡片有四个元素。两个文本视图(posttext,score是id)和两个按钮(minusOne和plusOne)。

下面的代码会在所有卡片上正确加载textview的内容和按钮。

我尝试实现以下行为。

按钮点击加号按钮,分数将被更改并且minusOne按钮被隐藏。

奇怪的是,分数在相应的卡片上得到了适当的更新。但是当在一张卡上执行动作时,隐藏部分似乎发生在多张卡中(每n + 5张卡)。我该如何解决?我哪里错了?谢谢。

P.S:建议标题编辑

@Override
    public void onBindViewHolder(
            final MyViewHolder viewHolder, final int position) {


        ParseObject model = items.get(position);
        viewHolder.posttext.setText(model.getString("postText"));
    viewHolder.score.setText(Integer.toString(model.getInt("score")));



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

            @Override
            public void onClick(View v) {


                ParseObject model = items.get(position);

                final int score = model.getInt("score");

                model.increment("score", 1);

                model.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {

                        if(e==null)
                        {
                            viewHolder.score.setText(Integer.toString(score+1));
                            viewHolder.minusOne.setVisibility(View.GONE);

                        }
                        else{
                            e.printStackTrace();
                           }
                    }
                });
            }
        });

1 个答案:

答案 0 :(得分:2)

你需要为你可以在模型或适配器中设置的减号按钮制作布尔的Arraylist,这个arraylist将包含按钮的状态,所以默认情况下它是真的,除非用户点击了它将更改为false,更新后只需通过notifyDataSetChanged()通知适配器,它将更新显示的视图作为布尔数组。

@Override
public void onBindViewHolder(
        final MyViewHolder viewHolder, final int position) {


    ParseObject model = items.get(position);
    viewHolder.posttext.setText(model.getString("postText"));
    viewHolder.score.setText(Integer.toString(model.getInt("score")));

     if (miusButtonStatus.get(position)) {
        viewHolder.minusOne.setVisibility(TextView.VISIBLE);
     } else {
        viewHolder.minusOne.setVisibility(TextView.GONE);
     }

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

        @Override
        public void onClick(View v) {


            ParseObject model = items.get(position);

            final int score = model.getInt("score");

            model.increment("score", 1);

            model.saveInBackground(new SaveCallback() {
                @Override
                public void done(ParseException e) {

                    if(e==null)
                    {
                        viewHolder.score.setText(Integer.toString(score+1));
                        miusButtonStatus.get(position) = false;
                        notifyDataSetChanged();

                    }
                    else{
                        e.printStackTrace();
                       }
                }
            });
        }
    });