簡體   English   中英

如何為單個 RecyclerView 行更改 ImageView drawable

[英]How To Change ImageView drawable For A Single RecyclerView Row

這個問題我不是特別清楚怎么問,所以我就用圖來解釋

在此處輸入圖像描述 在此處輸入圖像描述

在我的App中,下載圖標的onClick調用了該行視頻的下載方法。 下載完成后,圖標由黑色變為綠色。 boolean 標志用於將此 state 保存在 SharedPreference 中。 這個保存的 state 在我的 RecyclerView 適配器中被再次調用,因此下載的 state 可以在應用程序重新啟動時反映出來。

挑戰是……

當應用程序重新啟動時,只有下載的行圖標顯示為綠色,即使沒有下載,每行的圖標也會變為綠色。 下面是我的代碼。

class DownloadReceiver extends ResultReceiver { //DownloadReceiver class
                public DownloadReceiver(Handler handler) {
                    super(handler);
                }

                @Override
                protected void onReceiveResult(int resultCode, Bundle resultData) {
                    super.onReceiveResult(resultCode, resultData);
                    if (resultCode == TichaDownloadService.UPDATE_PROGRESS) {
                        int progress = resultData.getInt("progress"); //get the progress
                        //Set the progress to progressBarCir
                        progressBarCir.setProgress(progress);
                        icon_download.setVisibility(View.GONE);
                        progressBarCir.setVisibility(View.VISIBLE);
                        Log.i("STATUS", "DOWNLOADING>>>");
                        if (progress == 100) { // Downloade process is completed
                            isNotDownloaded = false; // Flagging that the video has been downloaded
                            progressBarCir.setVisibility(View.GONE);
                            // Setting the Download Icon to reflect the New color state
                            icon_download.setColorFilter(itemView.getContext().getResources().getColor(R.color.funnygreen));
                            icon_download.setVisibility(View.VISIBLE);
                            // Saving the boolean flag in SharedPreferece
                            SharedPreferences sharedPreferences = getSharedPreferences("com.example.instagramclone",MODE_PRIVATE);
                            sharedPreferences.edit().putBoolean("isDownloadedState",isNotDownloaded).commit();
                            
                            // Logging of the save state to confirm state is saved.
                            boolean newState= sharedPreferences.getBoolean("isDownloadedState",true);
                            Log.i("STATE XCHANGE", "DOWNLOADED HENCE, "+String.valueOf(newState));

                        }
                    } else {
                        Log.i("STATUS", " NOT DOWNLOADING,BOSS");
                    }
                }
            }

下面是我的適配器 Class 的 Holder 部分的片段

  public LectureClassesHolder(@NonNull final View itemView) {
        super(itemView);
        // Now we ref each custom layout view item using the itemView
        textViewTitle = itemView.findViewById(R.id.subject_topic);
        textViewDescription = itemView.findViewById(R.id.subject_description);
        textViewDuration = itemView.findViewById(R.id.subject_duration);
        imageViewDownload = itemView.findViewById(R.id.download);
        textViewUrl = itemView.findViewById(R.id.url_link);

        SharedPreferences sharedPreferences = itemView.getContext().getSharedPreferences("com.example.instagramclone",Context.MODE_PRIVATE);
        isNotDownloaded = sharedPreferences.getBoolean("isDownloadedState",true);

        if (isNotDownloaded){
            imageViewDownload.setColorFilter(itemView.getContext().getResources().getColor(R.color.black));
            Log.i("DOWNLOAD STATE ","NOT Downloaded State is "+ isNotDownloaded);
        }else {
            imageViewDownload.setColorFilter(itemView.getContext().getResources().getColor(R.color.funnygreen));
            Log.i("DOWNLOAD STATE ","NOT Downloaded State is "+ isNotDownloaded);
        }

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onItemClick(getSnapshots().getSnapshot(position), position, itemView);
                }
            }
        });

        // Incase e no work
        imageViewDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onViewItemClick(getSnapshots().getSnapshot(position), position, itemView);
                }
            }
        });
    }

我需要一種方法使更改僅對相關行有效。 將不勝感激有關如何實現這一目標的任何幫助。

問題當然是各個記錄與存儲的內容之間沒有關聯。最好的解決方案是使用一個數據庫,該數據庫的表包含至少一列用於下載 url 和另一個用於狀態,存儲具有所需狀態的記錄(例如,使用 0 表示未下載狀態,使用 1 表示已下載狀態)並在下載后使用 url 更新行的狀態列,然后您可以查詢以檢查記錄的狀態。但是在仍然使用共享的同時快速修復您的解決方案prefrence 是將鏈接存儲在一個數組中並檢查該數組,請參閱:

 public static String all_records(Context act)
{

    SharedPreferences prefs = act.getSharedPreferences("SHARED_PREFS_NAME", act.MODE_PRIVATE);

    return prefs.getString("all_records", "[]");
 
 
    
}
 public static void add_download(Activity act,String url)
{
    JSONArray ja=new JSONArray();
    try {
    ja=new JSONArray(all_records(act));
        JSONObject jo=new JSONObject();
        jo.put("url",url);
        ja.put(jo);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    SharedPreferences.Editor saver =act.getSharedPreferences("SHARED_PREFS_NAME", act.MODE_PRIVATE).edit();



    saver.putString("all_records",ja.toString());
    saver.commit();


}
public static boolean is_downloaded(Activity act,String url)
{
    JSONArray ja=new JSONArray();
    try {
    ja=new JSONArray(all_records(act));
        for (int i=0;i<ja.length();i++)
        {
            try {
                Log.e("Check ", "" + ja.getJSONObject(i).getString("url") + " Against " + url);
                if (ja.getJSONObject(i).getString("url").equalsIgnoreCase(url)) {
                    return true;
                }
            }catch (Exception ex){}
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }



    return false;
}

在這種情況下,您將在下載時像這樣使用它

protected void onReceiveResult(int resultCode, Bundle resultData) {
                super.onReceiveResult(resultCode, resultData);
                if (resultCode == TichaDownloadService.UPDATE_PROGRESS) {
                    int progress = resultData.getInt("progress"); //get the progress
                    //Set the progress to progressBarCir
                    progressBarCir.setProgress(progress);
                    icon_download.setVisibility(View.GONE);
                    progressBarCir.setVisibility(View.VISIBLE);
                    Log.i("STATUS", "DOWNLOADING>>>");
                    if (progress == 100) { // Downloade process is completed
                        isNotDownloaded = false; // Flagging that the video has been downloaded
                        progressBarCir.setVisibility(View.GONE);
                        // Setting the Download Icon to reflect the New color state
                        icon_download.setColorFilter(itemView.getContext().getResources().getColor(R.color.funnygreen));
                        icon_download.setVisibility(View.VISIBLE);
                        // Saving the boolean flag in SharedPreferece
                        add_download(/*your context*/,/*your url*/);

                    }
                } else {
                    Log.i("STATUS", " NOT DOWNLOADING,BOSS");
                }
            }

在您的回收視圖適配器 onbindview 或任何您想要檢索是否已下載call is_downloaded(/*YOUR CONTEXT*/,"YOUR URL");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM