2017-07-14 180 views
0

我需要能夠保存複選框的狀態。當應用程序關閉時,它應該保存哪些複選框被選中,當應用程序恢復時,應該在啓動時檢查選中的複選框。它使用自定義適配器列表視圖。感謝您的時間。Android Custom ListView複選框保存狀態

public class OrderActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_order); 

     getSupportActionBar().setTitle("Order"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     ListView listview; 
     CustomChoiceListViewAdapter adapter; 
     adapter = new CustomChoiceListViewAdapter(); 
     listview = (ListView) findViewById(R.id.listview1); 
     listview.setAdapter(adapter); 

     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a1), "1"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a2), "2"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a3), "3"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a4), "4"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a5), "5"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a6), "6"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a7), "7"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a8), "8"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a9), "9"); 
     adapter.addItem(ContextCompat.getDrawable(this, R.drawable.a10), "10"); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       finish(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

public class ListViewItem { 
    private Drawable icon; 
    private String text; 

    public void setIcon(Drawable icon) { 
     this.icon = icon; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public Drawable getIcon() { 
     return this.icon; 
    } 

    public String getText() { 
     return this.text; 
    } 
} 

public class CustomChoiceListViewAdapter extends BaseAdapter{ 

    private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>() ; 
    public CustomChoiceListViewAdapter() { } 

    @Override 
    public int getCount() { 
     return listViewItemList.size() ; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final int pos = position; 
     final Context context = parent.getContext(); 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.item_order, parent, false); 
     } 

     ImageView iconImageView = (ImageView) convertView.findViewById(R.id.imageview1) ; 
     TextView textTextView = (TextView) convertView.findViewById(R.id.text_name) ; 

     ListViewItem listViewItem = listViewItemList.get(position); 

     iconImageView.setImageDrawable(listViewItem.getIcon()); 
     textTextView.setText(listViewItem.getText()); 

     return convertView; 
    } 

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


    @Override 
    public Object getItem(int position) { 
     return listViewItemList.get(position) ; 
    } 

    public void addItem(Drawable icon, String text) { 
     ListViewItem item = new ListViewItem(); 

     item.setIcon(icon); 
     item.setText(text); 

     listViewItemList.add(item); 
    } 
} 

public class CheckableLinearLayout extends LinearLayout implements Checkable { 

    public CheckableLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // mIsChecked = false ; 
    } 

    @Override 
    public boolean isChecked() { 
     CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 
     return cb.isChecked(); 
     // return mIsChecked ; 
    } 

    @Override 
    public void toggle() { 
     CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 
     setChecked(cb.isChecked() ? false : true); 
     // setChecked(mIsChecked ? false : true) ; 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 

     if (cb.isChecked() != checked) { 
      cb.setChecked(checked); 
     } 


    } 
} 

回答

0

您可以使用SharedPreferences存儲複選框的狀態以備後用。但是,您需要爲每個複選框設置標識號才能執行此操作。以下面的格式存儲它:「.12.32.54.62」。其中12,32,54,62是被檢查框的標識號。讀取和寫入SharedPreferences文件可能需要一些時間,但我認爲這不會對您的性能造成太大影響。另一方面,我認爲在下面的代碼中還有改進的空間:

public class CheckableLinearLayout extends LinearLayout implements Checkable { 

String mId; 
SharedPreferences mShPreferences; 

public CheckableLinearLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mShPreferences = context.getSharedPreferences(
      "com.yourpackagename.PREFERENCE_FILE_KEY", Context.MODE_PRIVATE); 
} 

@Override 
public boolean isChecked() { 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 
    String key = "." + mId + "."; 
    return mShPreferences.getString("checkboxes", cb.isChecked() ? key : "").contains(key); 
} 

@Override 
public void toggle() { 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 
    setChecked(!cb.isChecked()); 
} 

@Override 
public void setChecked(boolean checked) { 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBox1); 

    if (cb.isChecked() != checked) { 

     cb.setChecked(checked); 

     String checkboxes = mShPreferences.getString("checkboxes", "."); 

     SharedPreferences.Editor editor = mShPreferences.edit(); 

     String key = "." + mId + "."; 

     if (checked && !checkboxes.contains(key)) 
      editor.putString("checkboxes", checkboxes + mId + "."); 
     else if (!checked && checkboxes.contains(key)) 
      editor.putString("checkboxes", checkboxes.replace(key, ".")); 

     editor.apply(); 
    } 
} 

public void setId(String id) { 
    this.mId = id; 
} 
}