2014-11-03 5 views
0

У меня есть два ListViews, treatmentListView и diaryListView. Если элемент clicked в обработкеListView, я хочу отобразить diaryListView этого элемента. Моя проблема заключается в том, что getView не получает вызов в MyDiaryAdapter, и никакие элементы не отображаются. Кто-нибудь получил исправление?Несколько ArrayAdapters - getView не вызывается в последнем

private void fillListView() 
{ 
    ArrayAdapter<Treatment> adapter = new MyListAdapter(); 
    list = (ListView) findViewById(R.id.treatmentsListView); 
    list.setAdapter(adapter); 

} 

private void fillDiaryListView() 
{ 
    ArrayAdapter<Diary> diaryAdapter = new MyDiaryAdapter(); 
    listDiary = (ListView) findViewById(R.id.diaryListView); 
    listDiary.setAdapter(diaryAdapter); 

} 


private class MyListAdapter extends ArrayAdapter<Treatment> 
{ 
    public MyListAdapter() 
    { 
     super(TreatmentList.this, R.layout.treatment_view, treatments); 
    } 

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

     View itemView = convertView; 
     if(itemView == null) 
     { 
      itemView = getLayoutInflater().inflate(R.layout.treatment_view, parent, false); 
     } 
     Treatment currentTreatment = treatments.get(position); 
     TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); 
     textMake.setText(currentTreatment.getName()); 
     TextView textStarted = (TextView)itemView.findViewById(R.id.textStarted); 
     TextView textMethod = (TextView)itemView.findViewById(R.id.textMethod); 
     return itemView; 
    } 
} 

private class MyDiaryAdapter extends ArrayAdapter<Diary> 
{ 

    public MyDiaryAdapter() 
    { 
     super(TreatmentList.this, R.layout.diary_view, notes); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View itemView = convertView; 
     if(itemView == null) 
     { 
      itemView = getLayoutInflater().inflate(R.layout.diary_view, parent, false); 
     } 
     Diary currentNote = notes.get(position); 
     TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); 
     textMake.setText(currentNote.getTitle()); 
     return itemView; 


    } 
} 

EDIT: Здесь "ноты" заполняется.

private void filldiaryList(Treatment treatment) 
{ 
    notes = dbDiary.findDiaryNotes(treatment); 
} 

Вот как первый список в OnClick обрабатывается:

private void registerClickCallback() { 
    list = (ListView)findViewById(R.id.treatmentsListView); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) 
     { 
      Treatment clickedTreatment = treatments.get(position); 
      loadDiaryList(clickedTreatment); 
     } 
    }); 

} 

EDIT 2: Весь файл:

public class TreatmentList extends Activity 
{ 
private ListView list, listDiary; 
private List<Treatment> treatments; 
private List<Diary> notes; 
private DbHandlerTreatments db; 
private DbHandlerDiary dbDiary; 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    db = new DbHandlerTreatments(this); 
    dbDiary = new DbHandlerDiary(this); 

    loadTreatmentList(); 

} 

private void registerClickCallback() { 
    list = (ListView)findViewById(R.id.treatmentsListView); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) 
     { 
      Treatment clickedTreatment = treatments.get(position); 
      loadDiaryList(clickedTreatment); 
     } 
    }); 

} 

private void registerDiaryClickCallback() { 
    listDiary = (ListView)findViewById(R.id.diaryListView); 
    listDiary.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) 
     { 
      Diary note = notes.get(position); 
      System.out.println(note.getTitle()); 
     } 
    }); 

} 

private void fillTreatmentList() 
{ 
    treatments = db.findAllTreatments(); 
} 

private void filldiaryList(Treatment treatment) 
{ 
    notes = dbDiary.findDiaryNotes(treatment); 
} 


private void loadTreatmentList() 
{ 
    setContentView(R.layout.treatments); 
    fillTreatmentList(); 
    fillListView(); 
    registerClickCallback(); 
} 

private void loadDiaryList(Treatment treatment) 
{ 
    setContentView(R.layout.diaries); 
    filldiaryList(treatment); 
    fillDiaryListView(); 
    registerDiaryClickCallback(); 
} 

private void fillListView() 
{ 
    ArrayAdapter<Treatment> adapter = new MyListAdapter(); 
    list = (ListView) findViewById(R.id.treatmentsListView); 
    list.setAdapter(adapter); 

} 

private void fillDiaryListView() 
{ 
    ArrayAdapter<Diary> diaryAdapter = new MyDiaryAdapter(); 
    listDiary = (ListView) findViewById(R.id.diaryListView); 
    listDiary.setAdapter(diaryAdapter); 

} 


private class MyListAdapter extends ArrayAdapter<Treatment> 
{ 
    public MyListAdapter() 
    { 
     super(TreatmentList.this, R.layout.treatment_view, treatments); 
    } 

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

     View itemView = convertView; 
     if(itemView == null) 
     { 
      itemView = getLayoutInflater().inflate(R.layout.treatment_view, parent, false); 
     } 
     Treatment currentTreatment = treatments.get(position); 
     TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); 
     textMake.setText(currentTreatment.getName()); 
     TextView textStarted = (TextView)itemView.findViewById(R.id.textStarted); 
     TextView textMethod = (TextView)itemView.findViewById(R.id.textMethod); 
     return itemView; 
    } 
} 

private class MyDiaryAdapter extends ArrayAdapter<Diary> 
{ 

    public MyDiaryAdapter() 
    { 
     super(TreatmentList.this, R.layout.diary_view, notes); 
     listDiary.invalidateViews(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View itemView = convertView; 
     if(itemView == null) 
     { 
      itemView = getLayoutInflater().inflate(R.layout.diary_view, parent, false); 
     } 

     Diary currentNote = notes.get(position); 
     TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); 
     textMake.setText(currentNote.getTitle()); 
     return itemView; 


    } 
} 
+0

Где находится "notes"? И где вы обрабатываете метод onItemClickListener для первого списка? Вы должны добавить больше кода, относящегося к этому. – JML

+0

@JML Я обновил свой вопрос с информацией сейчас. – themanwithballs

ответ

1

В случае, если нет никакого кода для onItemClickLister лечения и дневник. Я предлагаю 2 вещи.

  1. Если вы используете любой массив, укажите ... в адаптере, в функции getCount() каждого массива, вы должны вернуть размер. ПРИМЕЧАНИЕ: убедитесь, что вы звоните datasetchange
  2. В Listview есть одна вещь, она перерабатывает вид. в MyListAdapter вы проверяете convertView с нулевым значением, но не с другим. TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); это не имеет смысла.
+0

благодарит за ответ. Однако он не попадает в getView MyDiaryAdapter. Он загружает R.layout.diary_view, но он не получает itemview. – themanwithballs

+0

и что вы подразумеваете под «убедитесь, что вы называете« datasetchange »? @ Kidnan1991 – themanwithballs

+0

Пункт 2) неверен, он всегда извлекает представления строки через findViewById (и представление всегда не-null). в этом случае ему не нужна никакая привязка esle, но в будущем он должен проверить, что обычно используется «шаблон владельца», чтобы кэшировать все эти представления, а не искать их. – JML

0

Попробуйте вызвать notifyDataSetChanged() на diaryAdapter после загрузки списка Diary

@Override 
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) 
{ 
    Treatment clickedTreatment = treatments.get(position); 
    loadDiaryList(clickedTreatment); 
    diaryAdapter.notifyDataSetChanged() 
} 

Обратите внимание, что вам нужно сделать diaryAdapter переменного экземпляра класса вместо локального переменного метода fillDiaryListView

Изменить: чтобы завершить мой ответ, notifyDataSetChanged (хотя имя может быть самоочевидным) сообщает адаптеру, что модель данных, которая «заполняет» список, изменилась, заставив адаптер снова запустить весь процесс вызова обратных вызовов (теперь ваш массив должен быть не empty)