2011-04-18 3 views
0

내 Checkbox의 이전 상태를 복원하려고합니다. 내 활동에 약 20 개의 체크 박스가 있으며 원하는 것은 앱을 다시 시작하기 전에 확인란을 선택해야만 앱을 종료 할 수 있습니다. 사용자 지정 어댑터를 사용함에 따라 달성하기가 매우 어려웠습니다. 여기 Android - 앱을 다시 시작한 후 확인란 상태를 복원 할 수 없습니까?

내 어댑터의 코드입니다 -

public class IconAdapter extends BaseAdapter 
{ 
private Activity activity; 
private Object[] data; 
private ArrayList<HashMap<String,String>> listItems; 
public static LayoutInflater inflater = null; 
private PackageManager pm; 
public ArrayList<Boolean> itemChecked = null; 
public ArrayList<String> itemSelected = new ArrayList<String>(); 
public ArrayList<CheckBox> ctv = new ArrayList<CheckBox>(); 
//TextView textView; 
CheckBox cb; 
//ImageView imageView; 
public CompleteTaskManager ctm = new CompleteTaskManager(); 

public IconAdapter(Activity a, ArrayList<HashMap<String,String>> items) 
{ 
    activity = a; 
    listItems = items; 
    data = items.toArray(); 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    pm = a.getPackageManager(); 
    if(itemChecked==null){ 
     itemChecked = new ArrayList<Boolean>(); 
    for(int i = 0; i < items.size(); i++) 
    { 
     itemChecked.add(i,false); 
    }} 
    for(int i = 0; i < items.size(); i++) 
    { 
     itemSelected.add(i," "); 
    } 
    for(int i = 0; i < items.size(); i++) 
    { 
     cb = new CheckBox(a); 
     ctv.add(i,cb); 
    } 
} 

public int getCount() { 
    return listItems.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

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

public static class ViewHolder{ 
    public TextView textView; 
    public ImageView imageView; 
    public CheckBox checkBox; 
} 

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    final ViewHolder holder; 
    if(convertView==null) 
    { 
     row = inflater.inflate(R.layout.item, parent, false); 
     holder = new ViewHolder(); 
     holder.textView = (TextView)row.findViewById(R.id.text1); 
     holder.checkBox = (CheckBox)row.findViewById(R.id.check); holder.checkBox.setChecked(itemChecked.get(position)); 
     holder.imageView = (ImageView)row.findViewById(R.id.image); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder)row.getTag(); 

    } 

    String s = data[position].toString(); 
    String[] tokens = s.split(","); 
    String[] mToken = tokens[0].split("="); 
    String taskName = mToken[1]; 
    holder.textView.setText(taskName); 
    String[] mTokens = tokens[1].split("="); 
    final String pkgName = mTokens[1].substring(0, (mTokens[1].length() - 1)); 

    holder.checkBox.setTag(position); 
//this is how i am trying to restore the checked checkboxes. 
    **for(int i = 0; i < itemSelected.size(); i++) 
    { 
     if(itemSelected.contains(pkgName)) 
     { 
      holder.checkBox.setChecked(true); 
     } 
    }** 
    ctv.set(position,holder.checkBox); 
    holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(CompoundButton button, boolean b) { 
      Integer posClicked = (Integer)button.getTag(); 
      if(b) 
      { 
       itemChecked.set(posClicked, true); 
       itemSelected.set(posClicked, pkgName); 
      } 
      else 
      { 
       itemChecked.set(posClicked,false); 
       itemSelected.set(posClicked, " "); 
      } 
     } 
    }); 

    holder.checkBox.setChecked(itemChecked.get(position)); 

    try{ 
     Drawable icon = pm.getApplicationIcon(pkgName); 
     holder.imageView.setImageDrawable(icon); 
    } 
    catch (PackageManager.NameNotFoundException ne) 
    { 

    } 
    row.setId(position); 
    return row; 
} 

public boolean isChecked(int position) 
{ 
    return itemChecked.get(position); 
} 
public String getPkgName(int position) 
{ 
    return itemSelected.get(position); 
} 
public void removeItem(int position) 
{ 
    listItems.remove(position); 
} 
} 

여기 난 내 pkgNames을 복원하려고하는 코드입니다. 내 목록은 동적이지만 각 항목과 관련된 pkgName은 동일하게 유지되므로 위치를 바꿀 수 있다는 것을 알았 기 때문에 pkgName을 선택했습니다.

@Override 
public void onPause() 
{ 
    super.onPause(); 
    save(notes.itemSelected); 
} 
@Override 
public void onResume() 
{ 
    super.onResume(); 
    ArrayList<String> checkOld = load(); 

    for (int i = 0 ; i < checkOld.size(); i++) 
    { 
     notes.itemSelected = checkOld; 
    } 
} 
@Override 
public void onRestart() 
{ 
    super.onRestart(); 
    ArrayList<String> checkOld = load(); 

    for (int i = 0 ; i < checkOld.size(); i++) 
    { 
     notes.itemSelected = checkOld; 
    } 
} 

private void save(final ArrayList<String> isChecked) { 
SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPreferences.edit(); 
for(Integer i = 0; i < isChecked.size(); i++) 
{ 
    editor.putString(i.toString(), isChecked.get(i)); 
} 
editor.commit(); 
} 

private ArrayList<String> load() { 
SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    ArrayList<String> reChecked = new ArrayList<String>(); 
    for(Integer i = 0; i < notes.getCount(); i++) 
    { 
     reChecked.add(i, sharedPreferences.getString(i.toString(), " ")); 
    } 
    return reChecked; 
} 
} 

제발 도와주세요 !!

+0

load() 메소드에 디버그 로깅을 추가하여 문제의 범위를 좁히십시오. sharedPreferences에서 기대하는 바를 얻고 있는지 확인하십시오. – levis501

답변

관련 문제