2014-11-03 4 views
0

두 개의 ListView, treatmentListView 및 diaryListView가 있습니다. 치료 목록보기에서 항목을 클릭하면 해당 항목의 diaryListView를 표시하려고합니다. 내 문제는 MyDiaryAdapter에서 getView가 호출되지 않고 항목이 표시되지 않는다는 것입니다. 누구든지 고칠 수 있니?다중 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; 


    } 
} 

편집 : 여기 "노트"가 채워집니다.

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

은 Heres는 첫 번째 목록의 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; 


    } 
} 
+0

"메모"는 어디에 채워 집니까? 그리고 첫 번째 목록에 대해 "onItemClickListener"메서드를 어디에 처리합니까? 이와 관련하여 더 많은 코드를 추가해야합니다. – JML

+0

@JML 정보로 내 질문을 업데이트했습니다. – themanwithballs

답변

1

경우, 치료의 onItemClickLister에 대한 코드가 없기를 일기. 나는 2 가지를 제안한다.

  1. 각 어레이의 getCount() 함수에서 임의의 배열, 목록 ...을 어댑터에 사용하는 경우 크기를 반환해야합니다. 참고 : 전화 하시려면 datasetchange
  2. Listview는보기를 재사용합니다. MyListAdapter에서 null로 전환하지만 다른 중괄호가없는 convertView를 확인합니다. TextView textMake = (TextView)itemView.findViewById(R.id.txtMake); 이것은 의미가 없습니다.
+0

답장을 보내 주셔서 감사합니다. 그러나 그것은 MyDiaryAdapter의 getView에 들어 가지 않습니다. R.layout.diary_view를로드하지만 itemview를 얻지 못합니다. – themanwithballs

+0

당신이 "datasetchange"를 호출했는지 확인하는 것은 무엇을 의미합니까? @ kidnan1991 – themanwithballs

+0

포인트 2)는 사실이 아니며 findViewById를 통해 항상 행의 뷰를 검색합니다 (뷰는 항상 null이 아닙니다). 그 경우 그는 철저한 보조기가 필요하지 않습니다.하지만 앞으로는 일반적으로 사용되는 "홀더 패턴"을 조사하여 모든보기를 캐시하지 않아도됩니다. – JML

0

당신이 fillDiaryListView 방법의 지역 변수 대신 diaryAdapter에게 클래스 인스턴스 변수를 확인해야합니다 그 일기 목록을

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

주를로드 한 후 diaryAdapter에 notifyDataSetChanged()를 호출 시도

편집 : 조금 내 대답을 완료하려면 notifyDataSetChanged (이름은 자체 설명이 가능할 수 있음) 어댑터에 콜백을 다시 호출하는 모든 프로세스를 시작하도록 어댑터가 목록을 "채우는"데이터 모델이 변경되었음을 알립니다. (지금 당신의 배열은 비어 있음)

관련 문제