Несколько ArrayAdapters - getView не вызывается в последнем
У меня есть два ListViews, treatmentListView и diaryListView. Если элемент нажимается в treatmentListView, я хочу отобразить diaryListView этого элемента. Моя проблема в том, что getView не вызывается в MyDiaryAdapter, и никакие элементы не отображаются. Кто-нибудь получил исправление?
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;
}
}
РЕДАКТИРОВАТЬ: Здесь "заметки" заполняется.
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);
}
});
}
РЕДАКТИРОВАТЬ 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;
}
}
2 ответа
В случае, если нет никакого onItemClickLister кода лечения и дневник. Я предлагаю 2 вещи.
- Если вы используете какой-либо массив list... в адаптере, в функции getCount() каждого массива вы должны вернуть размер. ПРИМЕЧАНИЕ: обязательно позвоните
datasetchange
- У Listview есть одна вещь, он повторяет представление. в MyListAdapter вы проверяете convertView с нулем, но без скобки.
TextView textMake = (TextView)itemView.findViewById(R.id.txtMake);
это может не иметь никакого смысла.
Попробуйте вызвать notifyDataSetChanged() в diaryAdapter после загрузки списка дневников.
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id)
{
Treatment clickedTreatment = treatments.get(position);
loadDiaryList(clickedTreatment);
diaryAdapter.notifyDataSetChanged()
}
Обратите внимание, что вам нужно сделать diaryAdapter переменной экземпляра класса вместо локальной переменной метода fillDiaryListView
Редактировать: чтобы завершить мой ответ, notifyDataSetChanged (хотя имя может быть самоочевидным) сообщает адаптеру, что модель данных, которая "заполняет" список, изменилась, заставляя адаптер запустить весь процесс повторного вызова обратных вызовов (теперь ваш массив должен быть не пустым)