1

我想要做類似this,我已經使用cardview和recyclerview。我在下面添加了最喜歡的按鈕cardview,你可以看到完整的代碼。在recyclerview適配器中,我根據位置打印Toast,並且它的工作正常,現在我需要將arraylist中的共享首選項中的位置的int值保存到下一個intent中並顯示這些arraylist。在sharedPreferences中存儲位置列表,並在另一個活動中檢索

這是我recyclerview適配器

public void onBindViewHolder(NameViewHolder holder, final int position) { 
    holder.textView.setText(names.get(position).textView); 
    holder.favourite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(view.getContext()); 
      SharedPreferences.Editor editor = sp.edit(); 
      editor.putInt("key", position); //may be or may not be. 
      //add code here to save position in array 
      Toast.makeText(view.getContext(),"Fav "+position,Toast.LENGTH_SHORT).show(); 
     } 
    }); 

cardview.xml

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

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/cardview" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_margin="3dp" 
android:orientation="vertical" 
app:cardBackgroundColor="@android:color/transparent" 
app:cardCornerRadius="8dp" 
app:cardElevation="3dp" 
app:cardPreventCornerOverlap="false" 
app:cardUseCompatPadding="true"> 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:paddingTop="3dp" 
    android:textAlignment="center" 
    android:textColor="#ff9901" 
    android:textSize="35sp" 
    android:textStyle="italic" /> 

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:id="@+id/favourite" 
     android:src="@drawable/star" 
     android:background="@android:color/transparent" 
     /> 
</RelativeLayout> 
</android.support.v7.widget.CardView> 

我提供從prefrences越來越ArrayList和如何在ListView中使用過。

+0

能否請您添加活動java代碼? – HourGlass

+0

我需要發佈哪部分代碼?我已經發布我如何稱爲最喜歡的按鈕。如果在列表中按下收藏夾按鈕,則應將項目添加到共享預置中。 – Queendevelopers

回答

0

這一行後:

editor.putInt("key", position); 

把這個:

editor.apply(); 

我想你應該將這些值添加到列表中,而不是,然後將列表傳遞給另一個活動,如設置了一個param,那將是一個更好的方法。

編輯2

// take a global string 
String positions = ""; 

public void onClick(View view) { 
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(view.getContext()); 
      SharedPreferences.Editor editor = sp.edit(); 
      /* here first concat the current item position with the string, then put that in the pref */ 
      positions = positions + position + " "; 
      editor.putString("key", positions); 

     } 



//in the next activity, 
String key = sp.getString("key"); 
String[] positions = key.split(" "); 
// Now you have all the positions in the next activity and its in the String datatype 
// if you wanna int datatype there, parse it through Integer.parseInt(string). 
+0

ya,如果我確實添加了editor.putInt(「key」,position);在列表中只會添加一個值不是嗎?用戶可以點擊多個列表項,因此我需要發送多個位置。我這樣做? – Queendevelopers

+0

我認爲列表將是一個更好的方法,只需在構造函數中初始化一個ArrayList 列表,並且當用戶單擊該項目時,list.add(position);,只要您想將用戶重定向到下一個活動,把列表中的構造函數分配給新的列表中的下一個活動...需要更多的幫助嗎? – samirk433

+0

你會請你回答一個代碼嗎?我是新手。我需要保存在sharedPrefrences,以便當用戶可以看到 – Queendevelopers

0

首先,考慮到數據包通過的意圖傳遞。如果您在應用關閉後不需要存儲此信息,請使用該方法。

如果你還想保存你的數據,通過重新運行應用程序,那麼SharedPreferences沒問題,這裏是代碼,你如何實現這個功能。首先讓我們寫片斷,可以幫助你恢復與他們的項目和更新適配器:

private static final String CHECKED_ITEMS_REF = "checked_items"; 
private SharedPreferences sharedPreferences = getContext().getSharedPreferences("MySharedPrefs", MODE_PRIVATE); 

private void restoreAdapterState(RecyclerView.Adapter adapter) { 
    Set<String> savedCheckedItems = sharedPreferences.getStringSet(CHECKED_ITEMS_REF, new HashSet<>()); 
    List<Integer> checkedPositions = convertToCheckedItems(savedCheckedItems); 
    for (Integer position : checkedPositions) { 
     //update somehow info about checked items, for example in 
     //adapter you can store set of checked positions and in 
     //onBindViewHolder function check is ViewHolder position 
     //contained in you set 
     adapter.notifyItemChanged(position); 
    } 
} 

private List<Integer> convertToCheckedItems(Set<String> checkedItems) { 
    List<Integer> result = new ArrayList<>(); 
    for(String itemPositionStr : checkedItems) { 
     int position = Integer.parseInt(itemPositionStr); 
     result.add(position); 
    } 

    return result; 
} 

請注意,你可以按照我的建議在註釋,然後restoreAdapterState將被修改:

private void restoreAdapterState(MultiCheckedAdapter adapter) { 
    Set<String> savedCheckedItems = sharedPreferences.getStringSet(CHECKED_ITEMS_REF, new HashSet<>()); 
    List<Integer> checkedPositions = convertToCheckedItems(savedCheckedItems); 
     adapter.setCheckedPositions(new HashSet<Integer>(checkedPositions)); 
} 

而且在MultyCheckedAdapter你會碰到這樣的:

private Set<Integer> checkedPositions = new HashSet<>(); 

public setCheckedPositions(Set<Integer> checkedPositions) { 
    this.checkedPositions = checkedPositions; 
    for (Integer position : checkedPositions) { 
     adapter.notifyItemChanged(position); 
    } 
} 

... 

@Override 
public void onBindViewHolder(MyHolder holder, final int position) { 
    if (checkedPositions.contains(position)) { 
     //use one binding 
    } else { 
     //use another binding 
    } 
} 

... 

然後,你需要改變你的代碼片段:

private Set<Integer> checkedPositions = new HashSet<>(); 

public void onBindViewHolder(NameViewHolder holder, final int position) { 
    holder.textView.setText(names.get(position).textView); 
    holder.favourite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //check somehow is current item checked or not. 
      //for example store set of checked items in adapter 
      //let's say it declaration is Set<Integer> checkedItems; 
      if (checkedPositions.contains(position)) { 
       checkedPositions.remove(position); 
       removeCheckedItem(position); 
      } else { 
       checkedPositions.add(position); 
       saveCheckedItem(position); 
      } 
     } 
    }); 
} 

private void saveCheckedItem(int position) { 
    Set<String> savedCheckedItems = sharedPreferences.getStringSet(CHECKED_ITEMS_REF, new HashSet<>()); 
    String positionStr = String.valueOf(position); 
    if (!savedCheckedItems.contains(positionStr)) { 
     savedCheckedItems.add(positionStr); 
     sharedPreferences.edit().putStringSet(CHECKED_ITEMS_REF, savedCheckedItems).apply(); 
    } 
} 

private void removeCheckedItem(int position) { 
    Set<String> savedCheckedItems = sharedPreferences.getStringSet(CHECKED_ITEMS_REF, new HashSet<>()); 
    String positionStr = String.valueOf(position); 
    if (savedCheckedItems.contains(positionStr)) { 
     savedCheckedItems.remove(positionStr); 
     sharedPreferences.edit().putStringSet(CHECKED_ITEMS_REF, savedCheckedItems).apply(); 
    } 
} 
+0

我試過你的代碼,但它對我來說太複雜了。因爲我是一個新的android。無論如何,謝謝Micheal – Queendevelopers

+0

你到底有什麼困難?如果您使用列表和共享狀態編碼您的第一個應用程序,那麼您必須瞭解列表,適配器和共享偏好如何工作。你也必須知道,如何在java中編寫程序。如果我們假設,那麼你到底有什麼困難?我可以編輯我的答案並解釋這些誤解 –

+0

您有四部分代碼。我真的很困惑把它們放在哪裏?那麼HashSet <>做了什麼?什麼是<>在做什麼?所有這些東西都很複雜,第一次聽到謝謝你?你能告訴我,在sharedPrefrences Context.Mode_APPEND是爲了附加值而不是替換一個嗎?那我們爲什麼不用這裏?我認爲使用Mode_APPEND將是乾淨的代碼? – Queendevelopers

0

您可以爲此使用StringBuilder。基於項目點擊追加/替換,然後將其作爲字符串保存到共享首選項。

public void onBindViewHolder(NameViewHolder holder, final int position) { 
    StringBuilder sb = new StringBuilder(sp.getStringPreference("key", "")) 
    holder.textView.setText(names.get(position).textView); 
    holder.favourite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(view.getContext()); 
      SharedPreferences.Editor editor = sp.edit(); 
      sb.append(position); 
      editor.putString("key", sb.toString()); 
      Toast.makeText(view.getContext(),"Fav "+position,Toast.LENGTH_SHORT).show(); 
     } 
    }); 

整數項可以從字符串使用的Integer.parseInt(s.charAt(索引))被檢索; 但是,如果您需要將值傳遞給下一個活動,並且以後不需要,那麼可以使用ArrayList並通過Intent傳遞它。

+0

sp找不到你在第二行的StringBuilder中定義了嗎? – Queendevelopers

+0

sp是你的共享偏好,你可以使它成爲全局的。 – Amit

+0

好的,當我回家時我會試試這個,我會評論你回來! ;) – Queendevelopers

0

用它來存儲

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(view.getContext().MODE_PRIVATE); 
SharedPreferences.Editor editor = sp.edit(); 
editor.putInt("key", position); //may be or may not be. 
editor.commit; 

,並在其他活動中使用這個檢索

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(view.getContext().MODE_PRIVATE); 
      int position=sp.getInt("key"); 

,你也可以嘗試這個 像的活動爲您 創建活動B

的意圖
Intent intent =new Intent(A.this,B.class); 
intent.putExtra("key",position); 
startActivity(intent); 

您的活動B

Intent intent= getIntent(); 
int position Integer.parseInt(intent.getExtras().get("key")); 

編輯

使用ArrayList和從一個活動轉移到另一個

ArrayList<Integer> mThumbIds=new ArrayList<Integer>() ; 
    mThumbIds.add(R.drawable.sample_0); 
      mThumbIds.add(R.drawable.sample_1); 
      mThumbIds.add(R.drawable.sample_2); 
      mThumbIds.add(R.drawable.sample_3); 
      mThumbIds.add(R.drawable.sample_4); 
      mThumbIds.add(R.drawable.sample_5); 
      mThumbIds.add(R.drawable.sample_6); 
      mThumbIds.add(R.drawable.sample_7); 
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       ArrayList list=mThumbIds; 
       Intent intent= new Intent(A.this,B.class); 
         intent.putExtra("list",mThumbIds); 
       intent.putExtra("position",position); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
       // overridePendingTransition(R.anim.hold,R.anim.slide_in_left); 
        startActivity(intent); 




      } 
     }); 

現在用這個你ativity乙

Intent intent =getIntent(); 


     int position=Integer.parseInt(intent.getExtras().get("position").toString()); 
     ArrayList<Integer> list= (ArrayList<Integer>) intent.getExtras().get("list"); 

int current_position=list.get(position) 
+0

這將取代sharedPrefrences中的值,如果我點擊另一個,我需要所有點擊的值,爲此它可能需要Context.MODE_APPED?或者是什麼?請重新編輯您的答案 – Queendevelopers

+0

爲了您想要的位置所有的位置 –

+0

我已經在我的問題上面上傳了教程鏈接。我想做出類似的那樣,但那篇教程對我來說很難,因爲我是新手,所以我要求一個簡單的,以便我能夠很好地理解 – Queendevelopers

相關問題