RecyclerView onBindViewHolder onclicklistener行为 [英] RecyclerView onBindViewHolder onclicklistener behavior

查看:951
本文介绍了RecyclerView onBindViewHolder onclicklistener行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图加载列出卡片,每张卡片有四个元素的回收视图。两个文本的意见(posttext,比分是ID)和两个按钮(minusOne和Plusone精选)。

在code以下加载TextView的内容和正确的按钮上的所有卡。

我尝试实施以下行为。

onbuttonclick Plusone精选按钮,将比分改变,minusOne按钮被隐藏。

奇怪的部分是,分数得到相应的卡正确更新。但是,当一张卡上执行操作的藏身部分出现在多张卡的情况发生。(每N + 5卡)。我该如何解决这个问题?我在哪里去了?谢谢你。

P.S:建议标题修改

  @覆盖
    公共无效onBindViewHolder(
            最后MyViewHolder viewHolder,最终诠释位置){
        的parseObject模型= items.get(位置);
        viewHolder.posttext.setText(model.getString(postText));
    viewHolder.score.setText(Integer.toString(model.getInt(分数)));        viewHolder.plusOne.setOnClickListener(新View.OnClickListener(){            @覆盖
            公共无效的onClick(视图v){
                的parseObject模型= items.get(位置);                最终诠释得分= model.getInt(得分);                model.increment(得分,1);                model.saveInBackground(新SaveCallback(){
                    @覆盖
                    公共无效完成(ParseException的E){                        如果(E == NULL)
                        {
                            viewHolder.score.setText(Integer.toString(得分+ 1));
                            viewHolder.minusOne.setVisibility(View.GONE);                        }
                        其他{
                            e.printStackTrace();
                           }
                    }
                });
            }
        });


解决方案

您需要做的ArrayList布尔为减号按钮可以设置在你的模型或任何你想要的适配器,此ArrayList将包含的状态按钮所以除非用户点击因此它会更改为false这将是真正的在默认情况下,经过更新,它只是,通知notifyDataSetChanged(适配器),它会更新显示视图作为布尔数组。

  @覆盖
公共无效onBindViewHolder(
        最后MyViewHolder viewHolder,最终诠释位置){
    的parseObject模型= items.get(位置);
    viewHolder.posttext.setText(model.getString(postText));
    viewHolder.score.setText(Integer.toString(model.getInt(分数)));     如果(miusButtonStatus.get(位置)){
        viewHolder.minusOne.setVisibility(TextView.VISIBLE);
     }其他{
        viewHolder.minusOne.setVisibility(TextView.GONE);
     }    viewHolder.plusOne.setOnClickListener(新View.OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            的parseObject模型= items.get(位置);            最终诠释得分= model.getInt(得分);            model.increment(得分,1);            model.saveInBackground(新SaveCallback(){
                @覆盖
                公共无效完成(ParseException的E){                    如果(E == NULL)
                    {
                        viewHolder.score.setText(Integer.toString(得分+ 1));
                        miusButtonStatus.get(位置)= FALSE;
                        notifyDataSetChanged();                    }
                    其他{
                        e.printStackTrace();
                       }
                }
            });
        }
    });

I am trying to load a recycler view that lists cards, each card has four elements. two text views(posttext, score are the id) and two buttons(minusOne and plusOne).

The code below loads the textview's content and buttons properly on all cards.

I try to implement the following behavior.

onbuttonclick of plusOne button, the score will be changed and the minusOne button is hidden.

The strange part is, the scores get updated properly on respective cards. But the hiding part appears to happen in multiple cards when the action is performed on one card.(every n+5th card). How do I fix this? Where am I going wrong? Thank you.

P.S : Suggest title edit

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

解决方案

You need to make Arraylist of booleans for the minus button you can set it in your model or in the adapter whatever you want, this arraylist will contains the status of the button so it will be true by default unless the user clicked so it will change to false, and after updating it just notify the adapter by notifyDataSetChanged() it will update the shown views as the array of booleans.

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

这篇关于RecyclerView onBindViewHolder onclicklistener行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆