2012-04-24 21 views
0

最近ListViewに問題が発生しました。 そこにはチェックボックスのリストがあります。チェックされた項目は、startActivityForResultでListActivityを開始する呼び出しアクティビティに供給されます。 ListActivityを呼び出す前にチェックされた項目があった場合、それらの項目は渡され、ユーザーは最初から選択を編集することができます。初めてのことはすべて大丈夫です。しかし、ListActivityを再度呼び出すことによって選択範囲を変更したい場合は、リストの最初のチェックボックスは、リスト内の項目がチェックされているかどうかチェックされるように、のように見えます。実際にはチェックされていません。つまり、既に選択されているアイテムをチェックするコードは、最初のアイテムを処理するときに起動せず、選択を再度保存した後も起動しません。明示的にチェックされていません(チェックをはずしてからもう一度チェックします)。私はこの問題を検索した場合、私がリストビューの最初の項目がフォーカスを受け取ることが分かったので、私は何の効果にCheckBoxesのAndroid ListViewは、項目がチェックされている場合、常に最初の項目をチェックします。

listView.setItemsCanFocus(false); 

を試み

。実際には、それが働いていれば驚いたでしょう。なぜなら、項目は空でない選択があるときだけチェックされるからです。私の問題に対処する質問は見つからなかったので、私はそれをまだ記述されている効果を生み出す例に煮詰めました。申し訳ありませんが、すべてのコードは、私は何を探しているので、私は私の問題を記述することができますか?呼び出し側の活動の

のonCreateとonActivityResult:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    listItems = new ArrayList<String>(); 
    list = (TextView) findViewById(R.id.list); 
    list.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Bundle extras = new Bundle(); 
      extras.putStringArrayList("item_list", listItems); 
      Intent i = new Intent(Main.this, CheckBoxListActivity.class); 
      i.putExtras(extras); 
      startActivityForResult(i,1); 
     } 
    }); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    Bundle extras = new Bundle(); 
    extras = intent.getExtras(); 
    String[] strings = extras.getStringArray("item_list"); 
    String text = ""; 

    listItems.clear(); 
    for (String item : strings) { 
     text = text + item + ", "; 
     listItems.add(item); 
    } 
    if (text.length() != 0) { 
     text = text.substring(0, text.length() - 2); 
    } else { 
     text = "(nothing here)"; 
    } 
    list.setText(text); 
} 

のonCreate()および仕上げ()ListActivity中:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.checkbox_list); 
    listView = getListView(); 

    save = (Button) findViewById(R.id.save_button); 
    save.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Log.i(LOG_TAG, "save button clicked"); 
      finish(); 
     } 
    }); 

    ArrayList<String> itemList = new ArrayList<String>(); 
    itemList.add("foo"); 
    itemList.add("bar"); 
    itemList.add("baz"); 
    itemList.add("qux"); 
    itemList.add("quux"); 

    checkedItems = getIntent().getExtras().getStringArrayList("item_list"); 
    ArrayAdapter<String> arrayAdapter = new ItemsAdapter(this, R.layout.checkbox_list, itemList); 
    listView.setAdapter(arrayAdapter); 

} 

@Override 
public void finish() { 
    Bundle extras = new Bundle(); 
    String[] stringArray = new String[checkedItems.size()]; 
    for (int i = 0; i < checkedItems.size(); i++) { 
     stringArray[i] = checkedItems.get(i); 
    } 

    extras.putStringArray("item_list", stringArray); 
    Intent mIntent = new Intent(); 
    mIntent.putExtras(extras); 
    setResult(RESULT_OK, mIntent); 
    super.finish(); 
} 

そしてArrayAdapter:

private class ItemsAdapter extends ArrayAdapter<String> { 

    public ItemsAdapter(Context context, int textViewResourceId, List<String> items) { 
     super(context, textViewResourceId, items); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.checkbox_list_row, null); 
     } 
     String entry = getItem(position); 
     v.setTag(entry); 
     fillText(v, R.id.checkbox, entry); 
     return v; 
    } 

    private void fillText(View v, int id, String text) { 
     Log.i(LOG_TAG, "this is fillText, our text is: " + text); 

     CheckBox checkBox = (CheckBox) v.findViewById(id); 
     if (checkedItems.contains(text)) { 
      Log.i(LOG_TAG, "item has to be checked"); 
      checkBox.setChecked(true); 
     } 
     checkBox.setText(text == null ? "" : text); 
     checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      public void onCheckedChanged(CompoundButton cb, boolean isChecked) { 
       String tag = (String) cb.getTag(); 
       if (cb.isChecked()) { 
        // add item to set of checkedItems 
        if (!checkedItems.contains(tag)) { 
         checkedItems.add(tag); 
         Log.i(LOG_TAG, "checkedItems: " + checkedItems.toString()); 
        } 
       } else { 
        // remove item from set of checkedItems 
        if (checkedItems.contains(tag)) { 
         checkedItems.remove((String) cb.getTag()); 
         Log.i(LOG_TAG, "checkedItems: " + checkedItems.toString()); 
        } 
       } 
      } 
     }); 
    } 
} 

答えて

0

変換ビューのチェックボックスがオンになっている可能性があることに注意する必要があります。テキストがリストにない場合は、チェックを外す必要があります。

private void fillText(View v, int id, String text) { 
     Log.i(LOG_TAG, "this is fillText, our text is: " + text); 

     CheckBox checkBox = (CheckBox) v.findViewById(id); 
     if (checkedItems.contains(text)) { 
      Log.i(LOG_TAG, "item has to be checked"); 
      checkBox.setChecked(true); 
     } else { 
      checkBox.setChecked(false);  
     } 
+0

ありがとうございました。どうやら時々私は明らかな解決策が見えるようになる前に自分自身をばかにする必要があります。 ;-) – user1351371

関連する問題