【问题标题】:ToggleButton getting updated for all the ListView itemsToggleButton 为所有 ListView 项目更新
【发布时间】:2019-03-26 20:44:30
【问题描述】:

我有一个ListView,每行包含ToggleButtonToggleButton 基本上是一个收藏按钮。首先,如果存在特定值,我会检查数据库,如果存在,我将按钮显示为红色,否则显示为灰色。问题是每当我单击任何按钮时,所有按钮都会变为红色,反之亦然,默认情况下,滚动时所有按钮也会更新。我的适配器代码是:

public class PostAdapter extends ArrayAdapter<PostModel> {
    Drawable mDrawable;
    ViewHolder viewHolder;

    public PostAdapter(Context context, ArrayList<PostModel> objects) {
        super(context, 0, objects);
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //Get the date item for this position
        final PostModel postModel = getItem(position);
        boolean isClicked = false;

        //Check if the existing view is being reused, otherwise inflate a new view from custom_row layout
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.custom_row, parent, false);
            viewHolder = new ViewHolder();
            //Casting of views from the custom_row layout
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tvPost = (TextView) convertView.findViewById(R.id.tvPost);
            viewHolder.imageIcon = (ImageView) convertView.findViewById(R.id.imageIcon);
            viewHolder.toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //Filling each views values
        viewHolder.tvTitle.setText(postModel.getTitle());
        viewHolder.tvPost.setText(postModel.getPost());
        viewHolder.imageIcon.setImageResource(postModel.getAssociatedDrawable());

        final DBHelper dbHelper = new DBHelper(getContext().getApplicationContext());
        dbHelper.open();

        if (dbHelper.isClickedPost(postModel.getTitle())) {
            Drawable mDrawable = ContextCompat.getDrawable(getContext().getApplicationContext(), R.drawable.favorite_icon);
            mDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));
            viewHolder.toggleButton.setBackgroundDrawable(mDrawable);
            isClicked = true;
        } else {
            viewHolder.toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getContext().getApplicationContext(), R.drawable.favorite_icon));
        }

        final boolean finalIsClicked = isClicked;

        viewHolder.toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    if (!finalIsClicked) {
                        Toast.makeText(getContext().getApplicationContext(), "Clicked.", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getContext().getApplicationContext(), "Clicked again.", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getContext().getApplicationContext(), "Hello...", Toast.LENGTH_SHORT).show();
                }
            }
        });

        return convertView;
    }

    static class ViewHolder {
        TextView tvTitle, tvPost;
        ImageView imageIcon;
        ToggleButton toggleButton;
    }
}

【问题讨论】:

    标签: android android-adapter android-togglebutton


    【解决方案1】:

    第一:

    您必须将toggleButton 本身放在viewHolder 中。像这样:

    static class ViewHolder {
        TextView tvTitle, tvPost;
        ImageView imageIcon;
        ToggleButton toggleButton;
    }
    

    然后改变这一行:

    toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);
    

    收件人:

    viewHolder.toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);
    

    另外,在其他地方而不是toggleButton 使用viewHolder.toggleButton

    要注意的另一件事是isClicked 也不应该放在适配器内,因为它为每一行保存不同的值。

    【讨论】:

    • 感谢您的回复。但是,我已经尝试过了。它给了我同样的问题。
    • 你确定吗?因为它似乎确实导致了问题。我可以看看你编辑的代码吗?
    • 您必须记住,Viewholder 用于跟踪每一行(项目)的视图。在上面的代码中,您将每一行的 toggleButton 存储在一个变量中。
    • 我已经更新了代码。问题仍然存在。@Behzad
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多