2010-08-09 33 views
1

我有一個非常困難的時間嘗試使用android的ListView multipleChoice模式。這是我想要做的:設置在ListView中初始檢查CheckedTextViews choiceMode =「multipleChoice」

我在遊戲設置屏幕上有一個「玩家」按鈕。單擊它時,它會打開另一個活動,其中包含CheckedTextViews中數據庫中所有播放器的multipleChoice ListView。我有這個工作正常,當你點擊一個玩家,他們將通過查詢game_players表添加或從遊戲中刪除。

我遇到的問題是設置ListView,以便在活動打開時,已經添加到遊戲中的玩家最先被檢查。

我試圖通過遍歷ListView活動中的整個列表來做到這一點,但這不起作用,因爲當前不可見的視圖無法訪問來檢查。

所以現在我正在努力做到這一點,我在bindView擴展SimpleCursorAdapter,但我甚至無法得到這個簡單的代碼工作:

@Override 
public void bindView(View _view, Context _context, Cursor _cursor) { 
    String name = c.getString(c.getColumnIndexOrThrow(from[0])); 

    this.player = (CheckedTextView)_view.findViewById(to[0]); 
    this.player.setText(name); 
    this.player.setChecked(true); 
} 

它正確地設置了玩家的名字用的setText()但我無法獲取任何框來檢查bindView。還有什麼地方我應該這樣做,還是我只是做錯了?

回答

7

致電setItemChecked()ListView每個檢查的位置。

+0

謝謝!我在onCreate中爲列表活動安排的循環現在非常棒。 – 2010-08-09 16:35:04

+1

爲什麼ListView中的「getView()」中的「setChecked(true)」失敗?我們是否真的需要再次遍歷列表? – 2012-05-14 11:03:38

+3

@ and-dev:「爲什麼ListView中的」getView()「中的」setChecked(true)「失敗? - 如果你選擇'multipleChoice',你將'Checkable'的控制交給'ListView'。如果您願意,歡迎您不要使用'multipleChoice'並自己管理'Checkable'。如果你的行有其他的*其他*而不是'Checkable',就像'RatingBar'一樣,你會這樣做。 OP詢問'multipleChoice' - 我的回答是針對這個請求的。 – CommonsWare 2012-05-14 21:25:46

0

我也遇到了麻煩,並將此解決方案拼湊在一起。我想直接將ListView傳遞給適配器,但選擇創建一個接口,以避免ListView和適配器之間的循環引用。

接口鬆散地耦合適配器列表:

public interface CheckControl { 
    public void setChecked(int position, boolean value); 
} 

自定義適配器:

private class MyAdapter extends CursorAdapter { 
    private CheckControl checkControl; 

    public MyAdapter(Context context, Cursor cursor, CheckControl checkControl) { 
     super(context, cursor, 0); 
     this.checkControl = checkControl; 
     ... 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ... 
     checkControl.setChecked(cursor.getPosition(), cursor.getInt(COL_ENABLED) == 1); 
     ... 
    } 
} 

這裏就是我如何使用這兩種元素。在我的情況下,我擴展ListViewFragment,但同樣可以在包含ListView的任何其他類中完成。

public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     .... 
     CheckControl checkControl = new CheckControl() { 
      public void setItemChecked(int position, boolean checked) { 
       getListView().setItemChecked(position, checked); 
      } 
     }; 
     setListAdapter(new MyAdapter(getActivity(), null, checkControl)); 

     // Kick off the loader 
     getLoaderManager().initLoader(LOADER_1, null, this); 
    } 
}