首页 > 解决方案 > ToggleButton 为所有 ListView 项目更新

问题描述

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

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;
    }
}

标签: androidandroid-adapterandroid-togglebutton

解决方案


第一的:

您必须将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也不应该将其放在适配器内,因为它为每一行保存不同的值。


推荐阅读