1

我問過如何使用文本文件保存複選框狀態,但建議使用共享首選項。我在使用文本文件之前嘗試了這種方法,但遇到同樣的問題 - 列表中的複選框檢查並取消選中。從共享首選項列表中保存複選框狀態

我的應用程序顯示設備上當前安裝的應用程序的列表,它顯示應用程序的標題,圖標和複選框。如果我檢查其中一個項目並向下滾動並重新備份,它通常會取消選中,並隨機檢查其他項目。我試圖獲取它,所以複選框狀態從共享首選項加載,並保存到用戶手動檢查框時。

這裏是爲ListView自定義適配器代碼:

public class AppDetailsAdapter extends BaseAdapter { 

private List<AppDetails> data; 
private Context context; 


public AppDetailsAdapter(Context context, List<AppDetails> data) { 
    this.context = context; 
    this.data = data; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 

    if (view == null) { 
     LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = vi.inflate(R.layout.custom_row_layout, null); 
    } 

    ImageView icon = (ImageView) view.findViewById(R.id.icon); 
    TextView text = (TextView) view.findViewById(R.id.text); 
    final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox); 
    final AppDetails item = data.get(position); 

    text.setText(item.name); 
    icon.setImageDrawable(item.icon); 

    SharedPreferences settings = context.getSharedPreferences("data",Context.MODE_PRIVATE); 
    boolean Checked = settings.getBoolean(item.name, false); 
    checkBox.setChecked(Checked); 

    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // Handle your conditions here 
     if(checkBox.isChecked()==true){ 

      SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE); 
      settings.edit().putBoolean(item.name,true).commit(); 
      Toast.makeText(context,"You selected "+item.name, Toast.LENGTH_SHORT).show(); 
     } 
     else { 
      SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE); 
      settings.edit().putBoolean(item.name,false).commit(); 
      Toast.makeText(context,"You deselected "+item.name, Toast.LENGTH_SHORT).show(); 
     } 




    } 
    }); 


    return view; 
} 

}

回答

2

這是因爲鑑於回收的發生。

u能嘗試一兩件事:
取而代之的是

if (view == null) { 
     LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = vi.inflate(R.layout.custom_row_layout, null); 
    } 

只寫一遍

LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = vi.inflate(R.layout.custom_row_layout, null); 

運行。

+0

這就是我想通過使用sharedpreference作爲布爾數組來做什麼,我錯了嗎? – user3343264 2015-04-01 16:08:11

+0

我已經更新了我的答案。試試並通知我。 – 2015-04-01 16:09:40

+0

哇,這似乎已經奏效,你能簡要說明爲什麼這是問題嗎?我一直在堅持這個年齡 – user3343264 2015-04-01 16:13:15