【问题标题】:Problem while disabling button after click in RecyclerView items单击 RecyclerView 项目后禁用按钮时出现问题
【发布时间】:2019-08-15 11:35:05
【问题描述】:

我想在点击后禁用 RecyclerView 中某个项目的两个按钮。我已经实现了以下代码: How to disable button in RecyclerView and from AsyncTask

我在 POJO 类中添加了布尔值来保持按钮 (isClicked) 的状态,单击后我会更新。

@Override
    public void onBindViewHolder(final NewsViewHolder holder, final int position) {

        if(Fragment.List.get(holder.getAdapterPosition()).isTrueBtnClicked){
            holder.btnPositive.setEnabled(false);
            holder.btnPositive.setBackgroundResource(R.color.darkGray);
            holder.btnNegative.setEnabled(false);
            holder.btnNegative.setBackgroundResource(R.color.darkGray);

        }else{
            //to do
        }
        //used position instead getAdapterPosition()
        if(BlicFragment.List.get(position).isLieBtnClicked){

            holder.btnPositive.setEnabled(false);
            holder.btnPositive.setBackgroundResource(R.color.darkGray);
            holder.btnNegative.setEnabled(false);
            holder.btnNegative.setBackgroundResource(R.color.darkGray);

        }else{
            //holder.btnPositive.setEnabled(false);
        }


        holder.btnPositive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //SendPost postingToDb = new SendPost();
                //postingToDb.sendPost(sTitle, sDesc, url, sDate, sImgUrl[0], 1, 0, "Blic");
                JSONPlaceHolderAPI mAPIService;
                mAPIService = ApiUtils.getAPIServiceFetch();
                mAPIService.getNews(url).enqueue(new Callback<Result>() {
                    @Override
                    public void onResponse(Call<Result> call, Response<Result> response) {
                        if(response.body().getSuccess()==1){
                            isPositiveBtnClicked(holder);
                        }else{
                            isPositiveBtnClicked(holder);
                        }
                    }

                    @Override
                    public void onFailure(Call<Result> call, Throwable t) {

                    }
                });

            }
        });

和方法

private void isPositiveBtnClicked(NewsViewHolder holder){
        Fragment.List.get(holder.getAdapterPosition()).setTrueBtnClicked(!Fragment.List.get(holder.getAdapterPosition()).isTrueBtnClicked);
        notifyDataSetChanged();
        Log.e("clicked positive button", String.valueOf(holder.getAdapterPosition()));
    }

我正面临那个按钮被禁用,接下来的五个按钮不受影响。但是点击的每六个按钮都会被禁用。最终所有其他人都被禁用。

【问题讨论】:

    标签: java android android-recyclerview state


    【解决方案1】:

    是的,这是因为 Recylerview 总是重用或渲染屏幕中出现的视图,从屏幕中出来@condition 那么必须有 else 部分才能使它们禁用。 以你的情况为例......

            if(Fragment.List.get(holder.getAdapterPosition()).isTrueBtnClicked){
                holder.btnPositive.setEnabled(false);
                holder.btnPositive.setBackgroundResource(R.color.darkGray);
                holder.btnNegative.setEnabled(false);
                holder.btnNegative.setBackgroundResource(R.color.darkGray);
    
            }else{
                holder.btnPositive.setEnabled(true);
                holder.btnPositive.setBackgroundResource(R.color.greenEnable);
                holder.btnNegative.setEnabled(true);
                holder.btnNegative.setBackgroundResource(R.color.greenEnable);
            }
    

    【讨论】:

    • 这解决了问题。动画呢?每次在视图中为按钮 onClick 设置动画后,动画再次触发?
    • 抱歉,你在做什么动画,在哪里?
    • 我想在点击时为这些按钮设置动画。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多