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

时间:2017-06-08 16:11:59

标签: android android-fragments android-recyclerview android-cardview

我有一个cardView,其中包含textView和“赞”按钮。每当按下“喜欢”按钮时,它将在另一个片段中显示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();

      }

    }
  });

3 个答案:

答案 0 :(得分:0)

  1. 在onclick方法中创建SharedPreferences的实例

    SharedPreferences prefs = getActivity()。getSharedPreferences(       " Preference_reference",Context.MODE_PRIVATE);

  2. 使用'喜欢'的名称。 item为键,boolean为类型 或者,如果项目永远不会改变顺序,则可以使用布尔数组作为类型。

  3. 保存onclick中共享pref是否喜欢某个项目。

    if(id == R.drawable.ic_like){

        likeImageView.setTag(R.drawable.ic_liked);
        likeImageView.setImageResource(R.drawable.ic_liked);
    
        prefs.edit().putBoolean("Unique id", true).commit();   
    
        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);
    
        prefs.edit().putBoolean("Unique id", false).commit();
    
        Toast.makeText(getActivity(),titleTextView.getText()+" removed from favourites",Toast.LENGTH_SHORT).show();
    }
    
  4. 在片段中,如果喜欢,则要显示项目,创建另一个SharedPreferences变量并使用它来初始化片段,以便显示其键值设置为true的任何项目。

    if(prefs.getBoolean(" Unique Id",false)){Show card}

  5. 您可以找到有关如何使用SharedPreferences的大量资源,因此我将代码保持在最低限度

答案 1 :(得分:0)

1-)存储数据

据我所知,你想在本地保留喜欢的内容。我们来探索Android Storage Options

  

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

     

您的数据存储选项如下:

     
      
  • 共享首选项:将私有原始数据存储在键值对中。
  •   
  • 内部存储:将私有数据存储在设备内存中。外耳炎
  •   
  • 存储:将公共数据存储在共享外部存储上。
  •   
  • SQLite数据库:将结构化数据存储在私有数据库中。
  •   
  • 网络连接:使用您自己的网络服务器在网络上存储数据
  •   

其他选项似乎不适合您的情况,所以我继续使用SharedPreferences和SQLite。

<强> SQLite的

大量相同的结构化数据应该存储在SQLite数据库中,因为数据库是为这种数据设计的。 由于数据是由数据库构建和管理的,因此可以查询使用SQL等查询语言获取与某些条件匹配的数据子集。 这使得可以搜索数据。 当然,管理和搜索大量数据会影响性能,因此从数据库读取数据可能比从SharedPreferences读取数据要慢。

<强> SharedPreferences

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

关于SQLite和SharedPreferences的more

所以你应该使用SQLite而不是SharedPreferences,因为你会存储多个像。这是关于如何使用SQLite的伟大tutorial

另外,我建议你使用这些库(LikeButtonLikeAnimation)让你的喜欢更漂亮。

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

答案 2 :(得分:0)

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