0

我有两个 ListView,treatmentListView 和 diaryListView。如果在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的代码。我建议两件事。

  1. 如果您在适配器中使用任何数组,列表...,在每个数组的 getCount() 函数中,您应该返回大小。注意:确保你打电话datasetchange
  2. Listview 有一件事,它回收视图。在 MyListAdapter 中,您使用 null 但没有其他大括号检查 convertView。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()
 }

请注意,您需要将 diaryAdapter 设为类实例变量,而不是 fillDiaryListView 方法的局部变量

编辑:为了完成我的回答,notifyDataSetChanged(尽管名称可能不言自明)告诉适配器“填充”列表的数据模型已更改,从而强制适配器开始再次调用回调的所有过程(现在你的数组不应该为空)

于 2014-11-04T12:45:11.540 回答