0
여기

내 문제 : 나는 사용자 정의 ArrayAdapter와 가진 목록보기 있습니다사용자 정의 ArrayAdapter 안에 CHOICE_MODE_MULTIPLE_MODAL에서 항목이 선택되어 있는지 확인하는 방법은 무엇입니까?

onCreate() 나의 목록 :

list = /*some list*/ 
listView = (ListView) findViewById(R.id.some_list); 
listView.setAdapter(new MapListAdapter(this, R.layout.custom_list_item, list)); 
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     listView.setItemChecked(position, true); 
    } 
}); 

mapListView.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

    @Override 
    public boolean onPrepareActionMode(...) { 
     // some unrelated working code 
    } 

    @Override 
    public void onDestroyActionMode(...) { 
     // some unrelated working code 
    } 

    @Override 
    public boolean onCreateActionMode(...) { 
     // some unrelated working code 
    } 

    @Override 
    public boolean onActionItemClicked(...) { 
     // some unrelated working code 
    } 

    @Override 
    public void onItemCheckedStateChanged(...) { 
     // some unrelated working code 
    } 
}); 

내 사용자 정의 ArrayAdapter와의 getView(...) :

@Override 
public View getView (int position, View view, ViewGroup parent) { 
    view = (LinearLayout) inflater.inflate(layoutId, null); 

    final ListItem entry = getItem(position); 

    // setting some textviews here and so on... 

    CheckBox checkBox = (CheckBox) view.findViewById(R.id.m_l_i_checkbox); 
    // my problem^

    return view; 
} 

내가 아는 어떤 목록 항목이 내가 선택하면 ActionMode 막대가 나타나고 모든 항목을 선택 취소 (토글)하면 사라집니다. 그러나 실제로 선택한 경우 나타낼 수있는 확인란을 갖고 싶습니다. 그러면 어떻게해야합니까? android.R.single_list_item_multiple_choice 및 기본 ArrayAdapter를 사용하면 잘 작동하지만 사용자 정의 배열을 사용하고 싶습니다. 어쩌면 내가 뭔가 잘못되어 가고 있고 또 다른 방법이있을 수 있습니까?

답변

2

나는 isSelectedOnList (부울)라는 Item 클래스에 "special"필드를 추가하여 비슷한 비헤이비어 맞춤 어댑터를 구현합니다. 그런 다음 OnItemClickListener에서 I는 다음과 같이 수행

listView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    mapListView.setItemChecked(position, true); 
    ...Get your item here...getItem(position).setIsSelectedOnList(!getItem(position).isSelectedOnList()); 
} 
}); 

그래서 지금 내 항목의 배열이 항목이 선택되는 알고있다. 그 다음의 getView 메서드에서 내 항목의 레이아웃 XML에있는 체크 박스를 업데이트 : 다중 선택에서 선택한 항목에 대한 안드로이드의 내부 메커니즘에보고 관심이 없었어요 그래서이 솔루션은 꽤 잘 나를 위해 작동

@Override 
public View getView (int position, View view, ViewGroup parent) { 
    view = (LinearLayout) inflater.inflate(layoutId, null); 

    final ListItem entry = getItem(position); 

    // setting some textviews here and so on... 

    CheckBox checkBox = (CheckBox) view.findViewById(R.id.m_l_i_checkbox); 
    // my problem^

    checkBox.setChecked(ListItem.isSelectedOnList()); 

    return view; 
} 

기울기.

희망 하시겠습니까?

+0

이것은 내가 생각해 낸 것과 정확히 같은 해결책입니다.하지만 문제는이 경우 작업 모드를 작동시키기 위해 항목 목록을 반복하여 검사해야하는 항목의 수를 확인해야합니다 (1 또는 그 이상 - 행동 모드를 시작하지 않으면 - 끝내십시오.) 그리고 많은 목록을 나열하면 모든 클릭에이 작업을 수행하는 속도가 느려지고 이미 구현되었지만 잘 문서화되지 않은 내용을 작성하는 것은 매우 짜증나게됩니다. 어떤 것인가?) –

+0

당신은이 부분에 특히주의해야합니다. 그러나이 특별한 경우에는 목록 반복이 일부 Java 컬렉션 클래스를 확장하지 않으면 가장 효율적인 방법입니다. 내부 메커니즘 인 안드로이드에서도 선택한 항목을 가져 오기 위해 어느 시점에서 목록을 반복해야하므로 속도에 대해 걱정할 경우 목록 크기를 작게 유지하려고합니다 (아마도 필터링이나 게으른 로딩 등). 나는 이것이 고통 인 것을 안다. 그러나 그것은 android를 위해 만들어졌다 :-) – Christos

0

나는 그것을 얻었습니다! View getView (int position, View view, ViewGroup parent)부모 실제로 같은이 ... 사용 후 목록보기와 그것을 캐스트 있도록 ListView가 될 것으로 보인다 :

checkBox.setChecked(((ListView)parent).isItemChecked(position)); 

... 하나의 선택 작품!

지금 누군가는 여전히, 나는 모든 귀 해요하지 않는 이유는 여러 알고 ... 경우 또는 눈 : D

편집 : OK, 그것은 정말 버그입니다! :