android - ToggleButton 为所有 ListView 项目更新
问题描述
我有一个ListView
由ToggleButton
每一行组成的。这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;
}
}
解决方案
第一的:
您必须将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
也不应该将其放在适配器内,因为它为每一行保存不同的值。
推荐阅读
- html - 如何在 jinja 中仅显示 5 个列表结果,从烧瓶返回结果?
- node.js - 我的代码一直在打印'Hi [{“FirstName”:“Martin”}]'。我怎样才能解决这个问题?
- c# - 按模式 mongodb 驱动器 c# 过滤
- python - 如何以编程方式将文件从 kubernetes pod 复制到 Google Cloud 存储桶
- firebase - Flutter - 在 null 上调用了方法 []
- javascript - 我不明白 reactJs 中的这个组件渲染行为
- javascript - 将一个键值分配给 JavaScript 中的另一个键值
- javascript - 如何使用 NgModel 在 Angular 中默认选中一个复选框?
- python - 如何在 Fabric 2 中重新创建“with lcd”?
- flask - 如何在特定蓝图中覆盖烧瓶应用装饰器“app.url_value_preprocessor”?