2016-07-28 79 views
2

我是新來的這個多選列表視圖。我想將複選框的選中狀態保存在列表視圖中,這樣如果用戶關閉應用程序然後再次打開,選中的複選框仍然保持選中狀態。有沒有辦法做到這一點。我搜索了它,發現它可以使用SharedPreference完成,但我沒有得到有關如何使用它的更多信息。由於在多選列表視圖中保存複選框的選中狀態

public class MainActivity extends AppCompatActivity { 

    ListView myList; 
    Button getChoice; 

    String[] listContent = { 

      "January", 
      "February", 
      "March", 
      "April", 
      "May", 
      "June", 
      "July", 
      "August", 
      "September", 
      "October", 
      "November", 
      "December" 

    }; 

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

     myList = (ListView)findViewById(R.id.list); 
     getChoice = (Button)findViewById(R.id.getchoice); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, listContent); 
     myList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     myList.setAdapter(adapter); 

     getChoice.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String selected = ""; 
       int cntChoice = myList.getCount(); 

       SparseBooleanArray sparseBooleanArray = myList.getCheckedItemPositions(); 
       for(int i = 0; i < cntChoice; i++){ 
        if(sparseBooleanArray.get(i)) { 
         selected += myList.getItemAtPosition(i).toString() + "\n"; 

        } 

       } 

       Toast.makeText(MainActivity.this, selected, Toast.LENGTH_LONG).show(); 

      } 
     }); 



    } 
} 

回答

1

您可以保存狀態,例如,在SharedPreferences。

所以你onCreateonDestroy方法將是這樣的:

SharedPreferences sharedPreferences = getSharedPreferences("MySharedPrefs", MODE_PRIVATE); 

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    ... 
    Set<String> checkedItemsSource = sharedPreferences.getStringSet("checked_items", new HashSet<String>()); 
    SparseBooleanArray checkedItems = convertToCheckedItems(checkedItemsSource); 
    for (int i = 0; i < checkedItems.size(); i++) { 
     int checkedPosition = checkedItems.keyAt(i); 
     listView.setItemChecked(checkedPosition, true); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 
    Set<String> stringSet = convertToStringSet(checkedItems); 
    sharedPreferences.edit() 
      .putStringSet("checked_items", stringSet) 
      .apply(); 
} 

private SparseBooleanArray convertToCheckedItems(Set<String> checkedItems) { 
    SparseBooleanArray array = new SparseBooleanArray(); 
    for(String itemPositionStr : checkedItems) { 
     int position = Integer.parseInt(itemPositionStr); 
     array.put(position, true); 
    } 

    return array; 
} 

private Set<String> convertToStringSet(SparseBooleanArray checkedItems) { 
    Set<String> result = new HashSet<>(); 
    for (int i = 0; i < checkedItems.size(); i++) { 
     result.add(String.valueOf(checkedItems.keyAt(i))); 
    } 

    return result; 
} 
+0

當我在我的應用程序中運行你的代碼時,應用程序在'SharedPreferences sharedPreferences = getSharedPreference'行去掉NPE'@Michael – CodeAssasins

+0

無論如何解決它。順便說一句,你的代碼是最好的人選。 @邁克爾。 – CodeAssasins

+0

另外,有沒有什麼辦法可以刪除這個sharedpreference? – CodeAssasins

0

列表項設置你的複選框選中這樣

listView.setOnItemClickListener(new OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       AppListOfAllApps hideSelectedApps = (AppListOfAllApps) parent.getItemAtPosition(position); 
       if (view != null) 
       { 
        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox1); 
        hideSelectedApps = (AppListOfAllApps) checkBox.getTag(); 
        hideSelectedApps.setSelected(!checkBox.isChecked()); 
        checkBox.setChecked(!checkBox.isChecked()); 
       } 
      } 
     }); 

存放在sharedprefrence選定的項目,然後鍵擊使存儲在共享列表和項目存在的所有項目之間的對比prefrence這樣

boolean chkbox = false; 
     String selecteditem = SharedPreferences.getSharedPref(getApplicationContext()).selecteditem(); 

則只是這樣做

if (allitems.contains(selecteditem)) 
       { 
        chkbox = true; 
       } 
       else 
       { 
        chkbox = false; 
       } 

現在它傳遞給適配器構造 這節省了複選框的狀態,也retrives它

+0

什麼'AppListOfAllApps'這裏?以及如何保存SharedPreference中的選定項目? – CodeAssasins

+0

對不起,我添加了我的代碼,我已經實現了你想做的事..... .....listlistofallapps是在適配器中的allitems .......保存與鍵值對兄弟選擇的項目 – tanmeet

0

對於您需要保持模型中的地位。並且,在每個onBindView調用中,只需按照模型重置狀態即可。 有關詳細信息,你可以從採取的幫助 -

https://stackoverflow.com/a/38182528/1741586

希望它會幫助你:)

+0

我使用的是listview。那麼如何在這裏使用帶有listview的模型類呢? @Neo – CodeAssasins

+0

它的簡單就是用你所有的數據做一個模型,你需要一行。而在getView只是更新您的複選框按模型。對模型中的複選框chnge的狀態變化也是如此。 – Neo

+0

試試吧!如果仍然無法解決問題,請讓我知道,我會很樂意幫助:) – Neo

0

首先,你需要保持選定值布爾數組,然後你可以將其存儲在sharedpreference和你還需要爲自定義適配器,還要檢查Multiple Checkbox values in listview storing & retrieving using sharedpreferences

活動

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



    String[] listArray = new String[] { //Add String values }; 
    SharedPreferences sharedPreferences = getSharedPreferences("status", MODE_PRIVATE); 

    Boolean[] checkedStatus = new Boolean[listArray.length]; 
    for (int index = 0; index < checkedStatus.length; index++) 
     checkedStatus[index] = sharedPreferences.getBoolean(Integer.toString(index), false); 

    ListView listView = (ListView) findViewById(R.id.listview); 
    CustomAdapter adapter = new CustomAdapter(this, R.layout.row_layout, listArray, checkedStatus); 
    listView.setAdapter(adapter); 
} 

嘗試這種方式

public class CustomAdapter extends ArrayAdapter<String> implements CompoundButton.OnCheckedChangeListener{ 

String[] values; 
Boolean[] checkedStatus; 

public CustomAdapter(Context context, int resource, String[] values, Boolean[] checkedStatus) { 
    super(context, resource, values); 

    this.values = values; 
    this.checkedStatus = checkedStatus; 
} 

@Override 
public int getCount() { 
    return values.length; 
} 

@Override 
public String getItem(int position) { 
    return values[position]; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if(view == null){ 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.row_layout, null); 
    } 

    TextView textView = (TextView) view.findViewById(R.id.title); 
    textView.setText(values[position]); 

    CheckBox box = (CheckBox) view.findViewById(R.id.chk); 
    box.setTag(position); 
    box.setOnCheckedChangeListener(this); 
    box.setChecked(checkedStatus[position]); 

    return view; 
} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    Integer index = (Integer) buttonView.getTag(); 
    checkedStatus[index] = isChecked; 
    String key = index.toString(); 

    SharedPreferences sharedPreferences=getContext().getSharedPreferences("status", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor=sharedPreferences.edit(); 
    editor.putBoolean(key,isChecked); 
    editor.apply(); 
} 
+0

我試過你的方式,但它在活動中要求布爾[]。有沒有其他的選擇? @Aditya Vyas – CodeAssasins

+0

然後在活動中創建布爾 –

相關問題