有一个带有一些值的 recyclerView 列表,当您转到某些元素открывается时,有关此元素的信息。如何使它在打开一个元素后改变列表中的颜色。
public class TopStoriesAdapter extends RecyclerView.Adapter<TopStoriesAdapter.ViewHolder> {
private List<Model> topStoriesList;
private Context context;
public TopStoriesAdapter(List<Model> topStoriesList, Context context) {
this.context = context;
this.topStoriesList = topStoriesList;
}
@Override
public TopStoriesAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false);
return new TopStoriesAdapter.ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final TopStoriesAdapter.ViewHolder viewHolder, int i) {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
viewHolder.storyTitle.setText(topStoriesList.get(i).getTitle());
viewHolder.storyCreator.setText(topStoriesList.get(i).getBy());
viewHolder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, TopStoryDetailActivity.class);
intent.putExtra("key", topStoriesList.get(viewHolder.getAdapterPosition()));
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return topStoriesList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.storyTitle)
TextView storyTitle;
@BindView(R.id.storyCreator)
TextView storyCreator;
public ViewHolder(View view) {
super(view);
storyTitle = (TextView) view.findViewById(R.id.storyTitle);
storyCreator = (TextView) view.findViewById(R.id.storyCreator);
this.view = view;
}
}
}
我找到了一个类似的例子,但我不能将它应用到我的适配器上。
您需要以某种方式识别每个数据元素。例如通过 ID。
此外,在您考虑状态从“未读”更改为“已读”的那一刻,您需要以某种方式将此状态保存在某处或更改它。
例如,您可以将已读取项目的 ID 写入 SharedPrefernce。甚至更好 - 如果您将所有内容都存储在数据库中并且模型有一个您将更改的“读取”字段。更好的是,所有数据都存储在服务器上,您可以更改服务器上的“读取”状态,然后更新客户端数据。
让我们从另一面来看问题。在这个适配器示例中,我们启动了一个
boolean值数组,当您单击数组中的列表项时,值会更改为true. 在该方法onBindViewHolder中,根据true/false背景设置红色/透明色。现在一切都已经解决了,让我们继续吧。由于我们需要在应用程序的后续启动时显示读取,因此我们需要用存储值的逻辑替换数组的逻辑。有两个选项 - 数据库或
Preferences. 我们将使用第二个,因为 它更简单,数据也很少。现在让我们考虑一下我们将以什么形式存储数据。即如果一共有10个元素,读取第2、5、7个,则in
Preferences为对,就是这样。毕竟,我们不存储位置,而是存储索引。现在实现本身
1)创建适配器前,需要获取数据
2)我们将数组连同数据一起发送到适配器
3) 适配器
这里我们从中取数据
Preferences(如果没有,那么我们不取),将字符串“解码”成一个布尔值数组,并将它们发送给适配器。红色/透明逻辑与上面的适配器相同。单击列表项时,我必须完全更新行和数据。关于过渡的几句话
一切都很顺利,当您切换回列表中的活动时,不会丢失任何内容。您可以返回
Intent-th 或finish()-th,唯一的区别是第一种情况下卷轴丢失。道德:像适配器一样思考