0

私は、治療リストビューと日記リストビューの2つのリストビューを持っています。アイテムが TreatmentListView でクリックされた場合、そのアイテムの diaryListView を表示したいと思います。私の問題は、MyDiaryAdapter で 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);
}

最初のリストの 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;


    }
}
4

2 に答える 2

1

場合によっては、治療と日記の onItemClickLister のコードがありません。私は2つのことを提案します。

  1. アダプタで配列、list... を使用する場合、各配列の getCount() 関数で、サイズを返す必要があります。注:必ず電話してくださいdatasetchange
  2. リストビューには、ビューをリサイクルするという 1 つのことがあります。MyListAdapter では、convertView を null でチェックしますが、else ブレースはチェックしません。TextView textMake = (TextView)itemView.findViewById(R.id.txtMake);これは意味がないかもしれません。
于 2014-11-04T00:22:51.370 に答える
0

ダイアリー リストを読み込んだ後、diaryAdapter で notifyDataSetChanged() を呼び出してみてください。

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

fillDiaryListView メソッドのローカル変数ではなく、diaryAdapter をクラス インスタンス変数にする必要があることに注意してください。

編集:私の答えを少し完成させるために、notifyDataSetChanged(名前は自明かもしれませんが)は、リストを「埋める」データモデルが変更されたことをアダプターに伝え、アダプターにコールバックを呼び出すすべてのプロセスを再度開始させます(今あなたの配列は空であってはなりません)

于 2014-11-04T12:45:11.540 に答える