2016-05-24 43 views
0

我需要在我的應用程序中實現收藏夾列表。經過4天的搜索和其他問題後,我得到了我應該使用數據庫製作收藏夾列表(我的程序使用json填充recyclerviews)。SharedPreferences在應用程序中製作最喜歡的列表

然後將json保存到數據庫是有效的,我可以按下一下鼠標,將json添加到數據庫並顯示數據庫數據的最愛列表。

正如我前面說的,我將json保存到數據庫以實現最愛列表。

現在我有一個問題,我該如何顯示是將這一行添加到收藏夾列表還是沒有? 換句話說,我想顯示堅實的心臟圖標,如果該行添加到收藏夾列表並顯示邊框心臟圖標,如果該行未添加到收藏夾列表。

我覺得這個工作,我需要使用SharedPreferences

這是我PreferenceHelper類:

public class PreferenceHelper { 

    private static final String NAME = "MY_PREFERENCES"; 
    public static final String MY_DATA = "myData"; 

    private SharedPreferences sharedPreferences; 

    public PreferenceHelper(Context context) { 
     sharedPreferences = context.getSharedPreferences(NAME,Context.MODE_PRIVATE); 
    } 

    public boolean getBoolean(String key){ 
     return sharedPreferences.getBoolean(key,false); 
    } 

    public void putBoolean(String key, boolean value){ 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean(key, value); 
     editor.commit(); 
    } 
} 

,這是我的AdapterRecyclerQuestiononBindViewHolder

@Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 

     holder.txtTitle.setText(questionha.get(position).getQuestionTitle()); 
     holder.txtDesc.setText(questionha.get(position).getQuestionDesc()); 
     holder.txtCntDown.setText(questionha.get(position).getQuestionDownCnt()); 
     holder.txtAuthorName.setText(questionha.get(position).getQuestionAuthorName()); 
     Glide.with(holder.itemView.getContext()).load(questionha.get(position).getQuestionAuthorPic()).into(holder.imgAuthorPic); 
     holder.txtDate.setText(questionha.get(position).getQuestionDate()); 

     PreferenceHelper preferenceHelper = new PreferenceHelper(holder.itemView.getContext()); 

     boolean checked = preferenceHelper.getBoolean(preferenceHelper.MY_DATA); 
     if(checked){ 
      holder.imgAddFav.setImageResource(R.drawable.ic_favorite_red_700_24dp); 
     }else { 
      holder.imgAddFav.setImageResource(R.drawable.ic_favorite_border_red_a700_24dp); 
     } 


     //=============BTN DOWNLOAD CLICK LISTENER ========================= 
     holder.btnDownload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
       DownloadManager.Request request = new DownloadManager.Request(Uri.parse(questionha.get(position).getQuestionDownLink())); 

       request.setTitle(questionha.get(position).getQuestionTitle()); 
       request.setDescription("در حال دانلود"); 
       request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, questionha.get(position).getQuestionDownFileName()); 
       long enqueueId = downloadManager.enqueue(request); 
      } 
     }); 

     //============== IMG ADD TO FAVORITE CLICK LISTENER ====================== 
     holder.imgAddFav.setOnClickListener(new View.OnClickListener() { 

      private PreferenceHelper preferenceHelper = new PreferenceHelper(context); 

      @Override 
      public void onClick(View v) { 

       boolean isClicked = preferenceHelper.getBoolean(preferenceHelper.MY_DATA); 

       if (!isClicked) { 
        Toast.makeText(v.getContext(), "اضافه شد " + isClicked, Toast.LENGTH_SHORT).show(); 
        holder.imgAddFav.setImageResource(R.drawable.ic_favorite_red_700_24dp); 
        preferenceHelper.putBoolean(preferenceHelper.MY_DATA, true); 
       } else { 
        Toast.makeText(v.getContext(), "حذف شد", Toast.LENGTH_SHORT).show(); 
        holder.imgAddFav.setImageResource(R.drawable.ic_favorite_border_red_a700_24dp); 
        preferenceHelper.putBoolean(preferenceHelper.MY_DATA, false); 
       } 
//=========== Save to Database =================================================   
       /*QuestionDatabaseAdapter databaseAdapter = new QuestionDatabaseAdapter(v.getContext()); 

       ModelQuestion question = new ModelQuestion(); 

      /*question.setQuestionTitle(questionha.get(position).getQuestionTitle()); 
       question.setQuestionDesc(questionha.get(position).getQuestionDesc()); 
       question.setQuestionDate(questionha.get(position).getQuestionDate()); 
       question.setQuestionAuthorName(questionha.get(position).getQuestionAuthorName()); 
       question.setQuestionAuthorPic(questionha.get(position).getQuestionAuthorPic()); 
       question.setQuestionDownLink(questionha.get(position).getQuestionDownLink()); 

       databaseAdapter.saveQuestion(question); 

       Toast.makeText(v.getContext(), "اضافه شد", Toast.LENGTH_SHORT).show(); 
       holder.imgAddFav.setImageResource(R.drawable.ic_favorite_red_700_24dp);*/ 

//=================================================================== 


      } 
     }); 
    } 

此代碼無法工作。

+0

當你運行你的代碼,會發生什麼?心臟符號總是顯示還是不顯示? – NezSpencer

+0

根據點擊它的心臟不同,如果我點擊接壤的心臟,它變成堅實的心臟,當我退出,並再次回到這個活動recyclerview中的所有項目都有一顆堅實的心臟和 –

回答

0

如果你想實現收藏夾列表。您應該將所有數據保存在SQLite中,並且還可以將其保存到後端,並將其添加到收藏夾中。
我實現了這個簡單的演示應用程序。

MainActivity.java

public class MainActivity extends AppCompatActivity { 
private RecyclerView recyclerView; 
List<Movie>movieList= new ArrayList<>(); 
private MoviesAdapter mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    for(int i=0;i<=20;i++){ 
     movieList.add(new Movie("Title"+i,false)); 
    } 

    mAdapter = new MoviesAdapter(movieList, MainActivity.this, new myClickListner() { 
     @Override 
     public void onItemClick(Movie obj, int pos) { 
      if (obj.isFav()){ 
       obj.setFav(false); 
       mAdapter.notifyDataSetChanged();// Here you can save this item's state to the preference or sqlite. 
      }else { 
       obj.setFav(true); 
       mAdapter.notifyDataSetChanged(); 
    // Here you can save this item's state to the preference or sqlite. 
      } 

     } 
    }); 
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(mAdapter); 

} 

} 

Movie.java

/** 
* Created by droidwithme on 24/05/16. 
*/ 
public class Movie { 
    private String title; 

    public boolean isFav() { 
     return isFav; 
    } 

    public void setFav(boolean fav) { 
     isFav = fav; 
    } 

    private boolean isFav; 

    public Movie() { 
    } 

    public Movie(String title, boolean flag) { 
     this.title = title; 
     this.isFav=flag; 

    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String name) { 
     this.title = name; 
    } 


    } 

適配器的代碼。

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> { 

private List<Movie> moviesList; 
private Context context; 
myClickListner myClickListner; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView title; 
    public ImageView imgFav; 
    public MyViewHolder(View view) { 
     super(view); 
     title = (TextView) view.findViewById(R.id.title); 
     imgFav=(ImageView)view.findViewById(R.id.imageFav); 
    } 
} 


public MoviesAdapter(List<Movie> moviesList, AppCompatActivity activity,myClickListner listner) { 
    this.moviesList = moviesList; 
    this.context=activity; 
    this.myClickListner=listner; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.row_item, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 
    final Movie movie = moviesList.get(position); 
    holder.title.setText(movie.getTitle()); 
    holder.imgFav.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myClickListner.onItemClick(movie,position); 
     } 
    }); 
    if (movie.isFav()){ 
     holder.imgFav.setImageDrawable(context.getResources().getDrawable(R.drawable.redheart)); 
    }else { 
     holder.imgFav.setImageDrawable(context.getResources().getDrawable(R.drawable.whiteheart)); 
    } 




} 

@Override 
public int getItemCount() { 
    return moviesList.size(); 
} 
} 

點擊界面(即有助於檢測在MainActivity
myClickListner.java

public interface myClickListner { 
    void onItemClick(Movie obj,int pos); 
} 

main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" /> 

    </RelativeLayout> 

row_item.xml

<?xml version="1.0" encoding="utf-8"?> 
點擊3210

<RelativeLayout 
    android:layout_width="match_parent" 
    android:orientation="horizontal" 
    android:layout_height="wrap_content"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:text="Title" 
    android:textSize="20dp" 
    android:id="@+id/title" 
    android:textStyle="bold" 
    android:layout_height="wrap_content" /> 

    <ImageView 
     android:layout_width="50dp" 
     android:layout_weight="1" 
     android:id="@+id/imageFav" 
     android:layout_marginTop="5dp" 
     android:layout_height="50dp" 
     android:clickable="true" 
     android:src="@drawable/whiteheart" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

</android.support.v7.widget.CardView> 

和所需的依賴

compile 'com.android.support:appcompat-v7:23.3.0' 
compile 'com.android.support:recyclerview-v7:23.1.1' 
compile 'com.android.support:cardview-v7:23.0.0' 
+0

你可以給電影模型 –

+0

對不起,我更新了代碼 –

相關問題