2014-05-11 5 views
1

일부 데이터를 목록보기에 올바르게 표시하기 위해 사용자 정의 어댑터를 구축했습니다. 에서 onContextItemSelected() 데이터 집합이 변경되고 을 호출하여 notifyDataSetChanged()을 호출하여 목록보기를 업데이트합니다. 외관상 어댑터의 getView() 메소드는의 onContextItemSelected() 이후에만 이 호출됩니다.getView()가 너무 늦게 호출되었습니다.

  1. 왜? contextItemSelected()에서
  2. 나는 방법 editLanguage() 이전의 getView ()으로 팽창하도록되어 버튼에 액세스해야 전화. getView()은 "너무 늦게"라고 불리며 NullpointerException이 발생합니다.

버튼은 "notifyDataSetChanged"에 의해 호출되어야하는 "getView"에서 비정상적으로 실행됩니다.

public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    languageItem selectedLanguage = languages.get((int) info.id); 
    switch (item.getItemId()) { 
    case EDIT: 
     languages.get((int) info.id).setSelected(true); 
     adapter.update(languages); 
     adapter.notifyDataSetChanged(); // call getView() of the adapter! 
     editLanguage(selectedLanguage); // access a button that was inflated by getView() 
//... 


public View getView(int position, View convertView, ViewGroup parent) {  
//...   
switch(getItemViewType(position)) { 
    case DEFAULT_LINE: 
    //... 
    break; 
    case EDIT_LINE: 
    convertView = LayoutInflater.from(getContext()).inflate(R.layout.language_row_edit, null); // contains button bu_language_change 
    viewHolder.button = (Button) convertView.findViewById(R.id.bu_language_change); 
    break; 
    //... 

버튼 (bu_language_change)에 액세스하려고하면 null이됩니다.

private void editLanguage(final LanguageItem languageToEdit) { 

Button editButtonConfirm = (Button) this.findViewById(R.id.bu_language_change); // null 

답변

0

notifyDataSetChanged는 어댑터가 getView 메서드의 시퀀스를 즉시 호출하도록합니다. 오히려 새로 고쳐 져야하며 비동기 적으로 발생한다고 알려줍니다. 당신은 당신이 언급 한 목표를 달성하려면 나는이 개 아이디어를 가지고 :

  1. 은 다음 EDIT_LINE 당신은 가시성 View.VISIBLE 변경에 표시 수준 View.GONEDEFAULT_LINE에서보기로 bu_language_change Button를 추가합니다. View.GONE은 레이아웃이 자식이없는 것처럼 행동하게 만듭니다 (bu_language_change Button).
  2. 어떻게 든 뷰를 팽창시킨 getView() 메소드에서 알리고 editLanguage 메서드를 호출하십시오. 그러나 나쁜 생각입니다. ...

...의 getView()가 정확히 항목 당 한 번을 호출 할 보장되지

또는 getView 방법의 몸에서이 editLanguage 메소드를 호출 Romain Guyin here 말한다 그것은 당신의 문제를 해결했을 것입니다.

ListView에 대한 Google I/O를 보는 것이 좋습니다. It's over here

+0

감사합니다. 첫 번째 솔루션이 저에게 효과적입니다. 실제로 나는이 해킹이 유일한 좋은 해결책이라고 상상할 수 없다. 세 가지 완전히 다른 행 유형이 있다고 가정합니다. 모든보기를 하나의 .xml 파일로 구현하고 가시성을 변경하는 것은보기 흉한 일입니다. 게다가 어댑터에서 editLanguage를 호출하면 SoD 원리가 침해됩니다. 어떤 제안? – null

관련 문제