Android 使用共享首选项在recyclerView中实现Like按钮

Android 使用共享首选项在recyclerView中实现Like按钮,android,android-fragments,android-recyclerview,android-cardview,Android,Android Fragments,Android Recyclerview,Android Cardview,我有一个cardView,它有一个textView和一个类似的按钮。无论何时按下like按钮,它都会在另一个片段中显示cardView,就像收藏夹一样 如何使用共享首选项或任何其他方法来实现这一点?我这样做是为了更改like按钮的颜色,但不知道如何将该cardView添加到另一个片段: likeImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View

我有一个
cardView
,它有一个
textView
和一个类似的按钮。无论何时按下like按钮,它都会在另一个片段中显示
cardView
,就像收藏夹一样

如何使用共享首选项或任何其他方法来实现这一点?我这样做是为了更改like按钮的颜色,但不知道如何将该
cardView
添加到另一个片段:

  likeImageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      int id = (int)likeImageView.getTag();
      if( id == R.drawable.ic_like){

          likeImageView.setTag(R.drawable.ic_liked);
          likeImageView.setImageResource(R.drawable.ic_liked);

          Toast.makeText(getActivity(),titleTextView.getText()+" added to favourites",Toast.LENGTH_SHORT).show();

      } else {

          likeImageView.setTag(R.drawable.ic_like);
          likeImageView.setImageResource(R.drawable.ic_like);
          Toast.makeText(getActivity(),titleTextView.getText()+" removed from favourites",Toast.LENGTH_SHORT).show();

      }

    }
  });
  • 在onclick方法中创建SharedReferences的实例

    SharedReferences prefs=getActivity()。GetSharedReferences( “偏好参考”,上下文。模式(私人)

  • 使用“喜欢”项的名称作为键,使用布尔值作为类型 或者,如果项目从不改变顺序,则可以使用布尔数组作为类型

  • 将项目是否喜欢保存到onclick中的共享pref中

    if(id==R.drawable.ic_-like){

  • 在要显示项(如果喜欢)的片段中,创建另一个SharedReferences变量并使用它初始化片段,以便它显示键值设置为true的任何项

    if(prefs.getBoolean(“唯一Id”,false)){Show card}

  • 您可以找到大量关于如何使用SharedReference的资源,因此我将代码保持在最低限度(存储数据)

    1-)

    据我从问题中了解,您希望将喜欢的内容保留在本地。让我们探讨一下

    Android为您提供了几个选项来保存持久性 应用程序数据。您选择的解决方案取决于您的具体情况 需要,例如数据是否应为应用程序私有 或可供其他应用程序(和用户)访问,以及有多少空间 您的数据需要

    您的数据存储选项如下:

    • 共享首选项:以键值对存储私有基元数据
    • 内部存储:在设备内存中存储私有数据
    • 存储:将公共数据存储在共享的外部存储器上
    • SQLite数据库:将结构化数据存储在私有数据库中
    • 网络连接:使用自己的网络服务器在web上存储数据
    其他选项似乎不适合您的情况,因此我将继续使用SharedReferences vs SQLite

    SQLite

    大量相同的结构化数据应该存储在SQLite数据库中,因为数据库是为此类数据设计的。 由于数据是由数据库组织和管理的,所以可以使用查询语言(如SQL)对其进行查询,以获得符合特定条件的数据子集。 这使得在数据中搜索成为可能。 当然,管理和搜索大型数据集会影响性能,因此从数据库读取数据可能比从共享引用读取数据慢

    共享参考资料

    SharedReferences是一个键/值存储,您可以在其中以特定键保存数据。 要从存储中读取数据,您必须知道数据的密钥。这使得读取数据非常容易。 但存储少量数据很容易,存储和读取大型结构化数据很困难,因为您需要为每个数据定义密钥, 此外,除非您有特定的密钥命名概念,否则无法在数据中进行真正的搜索

    有关SQLite和SharedReferences的信息

    因此,您应该使用SQLite而不是SharedReferences,因为您将存储多个like

    此外,我建议您使用这些库(和),使您喜欢的更漂亮

    2-)读取并显示数据

    我猜想您已经准备好了SQLite数据库,并且已经成功地在那里注册了数据。 以后会容易得多。 从数据库中读取数据并将其显示在相关片段中

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_like,
                container, false);
    
        //accessing database
        MySQLiteOpenHelper db = new MySQLiteOpenHelper(getActivity());
    
        //get all likes from database.
        //getAllLikes is a method that returns the likes you have stored in the database, as list.
        //You must write methods to write likes into the database and read from the database.
        List<MyLikeObject> likeList = new ArrayList<MyLikeObject>();
        likeList = db.getAllLikes();
    
        //find RecyclerView
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rvLike);
    
        //set layoutManger
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    
        //create an adapter
        MyAdapter mAdapter = new MyAdapter(likeList);
    
        //set adapter
         recyclerView.setAdapter(mAdapter);
    
        return view;
    }
    
    @覆盖
    创建视图上的公共视图(布局、充气机、视图组容器、,
    Bundle savedInstanceState){
    视图=充气机。充气(R.layout.fragment_like,
    货柜(虚假);;
    //访问数据库
    MySQLiteOpenHelper db=新的MySQLiteOpenHelper(getActivity());
    //从数据库中获取所有喜欢的内容。
    //getAllLikes是一个方法,它以列表的形式返回存储在数据库中的likes。
    //您必须编写方法,将like写入数据库并从数据库中读取。
    List likeList=new ArrayList();
    likeList=db.getAllLikes();
    //查找回收视图
    RecyclerView RecyclerView=(RecyclerView)view.findViewById(R.id.rvLike);
    //设置布局管理器
    setLayoutManager(新的LinearLayoutManager(getActivity());
    //创建一个适配器
    MyAdapter mAdapter=新的MyAdapter(likeList);
    //设置适配器
    recyclerView.setAdapter(mAdapter);
    返回视图;
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_like,
                container, false);
    
        //accessing database
        MySQLiteOpenHelper db = new MySQLiteOpenHelper(getActivity());
    
        //get all likes from database.
        //getAllLikes is a method that returns the likes you have stored in the database, as list.
        //You must write methods to write likes into the database and read from the database.
        List<MyLikeObject> likeList = new ArrayList<MyLikeObject>();
        likeList = db.getAllLikes();
    
        //find RecyclerView
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rvLike);
    
        //set layoutManger
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    
        //create an adapter
        MyAdapter mAdapter = new MyAdapter(likeList);
    
        //set adapter
         recyclerView.setAdapter(mAdapter);
    
        return view;
    }
    
    Like_btn.setOnClickListener(new OnClickListener()
    {
        **private boolean fun = true;**
    
        public void onClick(View v)
        {
            if(fun)
            {
                Like_btn.setImageResource(R.drawable.unlike);
                fun=false;
            }
            else
            {
                fun=true;
                Like_btn.setImageResource(R.drawable.like);
                Toast.makeText(getApplicationContext(), "Changed", Toast.LENGTH_LONG).show();
            }
        }
    });