RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 593502
Accepted
Morozov
Morozov
Asked:2020-11-20 23:27:14 +0000 UTC2020-11-20 23:27:14 +0000 UTC 2020-11-20 23:27:14 +0000 UTC

将项目标记为已读

  • 772

有一个带有一些值的 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;
    }
}
}

我找到了一个类似的例子,但我不能将它应用到我的适配器上。

java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. ЮрийСПб
    2020-11-20T23:34:44Z2020-11-20T23:34:44Z

    您需要以某种方式识别每个数据元素。例如通过 ID。

    此外,在您考虑状态从“未读”更改为“已读”的那一刻,您需要以某种方式将此状态保存在某处或更改它。

    例如,您可以将已读取项目的 ID 写入 SharedPrefernce。甚至更好 - 如果您将所有内容都存储在数据库中并且模型有一个您将更改的“读取”字段。更好的是,所有数据都存储在服务器上,您可以更改服务器上的“读取”状态,然后更新客户端数据。

    • 2
  2. Best Answer
    user194625
    2020-11-23T10:16:01Z2020-11-23T10:16:01Z

    让我们从另一面来看问题。在这个适配器示例中,我们启动了一个boolean值数组,当您单击数组中的列表项时,值会更改为true. 在该方法onBindViewHolder中,根据true/false背景设置红色/透明色。

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.AdapterHolder>
    {
        List<Model> names;
        boolean[] checked;
        int check_count = 0;
    
        public class AdapterHolder extends RecyclerView.ViewHolder {
            RelativeLayout tbrvitemroot;
            AdapterHolder(View itemView) {
                super(itemView);
                tbrvitemroot = (RelativeLayout)itemView.findViewById(R.id.tbrvitemroot);
            }
        }
    
        RecyclerViewAdapter(List<Model> names){
            names = names;
            checked = new boolean[names.size()];
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }
    
        @Override
        public AdapterHolder onCreateViewHolder(ViewGroup viewGroup, int p2)
        {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.tbrvitem, viewGroup, false);
            AdapterHolder pvh = new AdapterHolder(v);
            return pvh;
        }
        @Override
        public void onBindViewHolder(final AdapterHolder holder, final int position)
        {
    if(checked[position]) holder.tbrvitemroot.setBackgroundColor(Color.RED);
    else holder.tbrvitemroot.setBackgroundColor(Color.TRANSPARENT);
            holder.tbrvitemroot.setOnClickListener(new OnClickListener(){
                    @Override
                    public void onClick(View v)
                    {
                        checked[position] = true;
    //тут логика перехода
                    }
            });
        }
    
        @Override
        public int getItemCount()
        {
            return names.size(); 
        }
    
    }
    

    现在一切都已经解决了,让我们继续吧。由于我们需要在应用程序的后续启动时显示读取,因此我们需要用存储值的逻辑替换数组的逻辑。有两个选项 - 数据库或Preferences. 我们将使用第二个,因为 它更简单,数据也很少。现在让我们考虑一下我们将以什么形式存储数据。

    Не прочитано - 0
    Прочитано - 1
    

    即如果一共有10个元素,读取第2、5、7个,则inPreferences为

    0010010100
    

    对,就是这样。毕竟,我们不存储位置,而是存储索引。现在实现本身

    1)创建适配器前,需要获取数据

    boolean[] checked;
    SharedPreferences mSettings = getSharedPreferences("save_state", Context.MODE_PRIVATE);
    if (mSettings.contains("save"))
    String saved_str = mSettings.getString("save", ""));
    for(int x = 0; x<saved_str.length; x++){
    String saved_char = saved_str.substring(x, x+1);
    if(saved_char.equals("0")) checked[x] = false;
    else checked[x] = true;
    }
    else checked = new boolean[ /*здесь длина массива*/ ];
    

    2)我们将数组连同数据一起发送到适配器

    RecyclerViewAdapter rva = new RecyclerViewAdapter(names, checked);
    rv.setAdapter(rva);
    

    3) 适配器

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.AdapterHolder>
    {
    List<Model> names;
    boolean[] checked;
    int check_count = 0;
    
    public class AdapterHolder extends RecyclerView.ViewHolder {
        RelativeLayout tbrvitemroot;
        AdapterHolder(View itemView) {
            super(itemView);
            tbrvitemroot = (RelativeLayout)itemView.findViewById(R.id.tbrvitemroot);
        }
    }
    
    RecyclerViewAdapter(List<Model> names){
        names = names;
        checked = new boolean[names.size()];
    }
    
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }
    
    @Override
    public AdapterHolder onCreateViewHolder(ViewGroup viewGroup, int p2)
    {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.tbrvitem, viewGroup, false);
        AdapterHolder pvh = new AdapterHolder(v);
        return pvh;
    }
    @Override
    public void onBindViewHolder(final AdapterHolder holder, final int position)
    {
    if(checked[position])     holder.tbrvitemroot.setBackgroundColor(Color.RED);
    else     holder.tbrvitemroot.setBackgroundColor(Color.TRANSPARENT);
        holder.tbrvitemroot.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v)
                {
    holder.tbrvitemroot. setBackgroundColor(Color.RED);
    StringBuilder sb = new StringBuilder();
    for(int x = 0; x<names.size(); x++){
    String new_char = (checked[x]) ? "1" : "0";
    sb.append(new_char);
    }
                   Editor editor = mSettings.edit();
            editor.putString("save", sb.toString(););
            editor.apply();
    //тут логика перехода
                }
        });
    }
    
    @Override
    public int getItemCount()
    {
        return names.size(); 
    }
    
    }
    

    这里我们从中取数据Preferences(如果没有,那么我们不取),将字符串“解码”成一个布尔值数组,并将它们发送给适配器。红色/透明逻辑与上面的适配器相同。单击列表项时,我必须完全更新行和数据。

    关于过渡的几句话

    一切都很顺利,当您切换回列表中的活动时,不会丢失任何内容。您可以返回Intent-th 或finish()-th,唯一的区别是第一种情况下卷轴丢失。

    道德:像适配器一样思考

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5