【问题标题】:Listview data model updated but items not displayingListview 数据模型已更新,但项目未显示
【发布时间】:2014-12-23 18:18:00
【问题描述】:

我在这些论坛上搜索了近 3 个小时,看到了几个类似的问题,但没有一个答案适合我。

我有一个 Activity,有多个卡片视图。其中一个卡片视图有一个带有字符串值的 Spinner 和一个非常简单的 ListView。用户从 Spinner 中选择一个介于 1 和 12 之间的值。然后 ListView 应根据微调器列表中的位置显示与所选值相等的字符串数。例如,用户选择微调器列表中的第二项,ListView 显示 2 个字符串。我在列表视图上有一个自定义适配器。 ListView 本身最初显示单行,这是正确的。但是,在用户从微调器中选择一个值后,列表视图不会显示额外的行,它仍然只显示一行。 ListView 的数据来自一个 ArrayList。在用户选择一个值并且它具有正确的条目数之后,我已经检查了适配器的数据模型,ArrayList 本身也是如此,但无论我尝试什么,ListView 本身仍然只显示第一行。我尝试过 NotifyDataSetChanged 和 Invalidate 的所有变体,但均未成功。

各种代码示例:

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    if (parent == spDoseFrequency){
        Toast.makeText(this,String.valueOf(position),Toast.LENGTH_SHORT).show();
        rebuildReminderTimesList(position + 1);
    }
}

private void rebuildReminderTimesList(int numberOfTimes){
    Toast.makeText(this,"yup",Toast.LENGTH_SHORT).show();
    //reset selected item to position 1
    myApp.iSelectedReminderTimeIndex = 0;

    //clear array and list, then rebuild with hourly timeslots
    iarrTimes = new int[numberOfTimes][2];
    liReminderTimes.clear();
    int startTime = 8;
    for (int i = 0; i < numberOfTimes; i++){
        iarrTimes[i][0] = startTime + i;
        iarrTimes[i][1] = 0;
        liReminderTimes.add(pad(startTime + i) + ":00");
    }
    //refresh the listview
    myAdapter.notifyDataSetChanged();
}

public class ReminderListAdapter extends ArrayAdapter {

List<String> liTimes;
Context ctx;
LayoutInflater inf;

public ReminderListAdapter(Context ctx, List<String> liTimes) {
    super(ctx, R.layout.reminder_time_listview, liTimes);
    this.liTimes = liTimes;
    this.ctx = ctx;
    inf = LayoutInflater.from(ctx);
}

public void setLiTimes(List<String> liTimes){
    this.liTimes = liTimes;
}

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

    View view = convertView;
    ViewHolder viewHolder;

    if (view == null){
        view = inf.inflate(R.layout.reminder_time_listview,parent,false);
        viewHolder = new ViewHolder();
        viewHolder.sTime = (TextView) view.findViewById(R.id.tvTime);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.sTime.setText(liTimes.get(position));
    return view;
}

private static class ViewHolder{
    TextView sTime;
}

}

任何帮助都将不胜感激,因为这让我发疯了。

快速更新这个问题:我刚刚测试了提供多个值的初始列表,但即便如此它也只显示第一项。在 CardView 对象中使用 ListView 可能有问题吗?我所有的其他卡片都可以正常工作,只有 ListView 一张无法正常显示。

另外,我尝试修改代码,以便不更改列表中元素的数量,而只是更改第一个元素的字符串中的文本,并且效果很好。所以 notifyDataSetChanged 似乎正在工作,但它不会显示多个项目。快速检查 Adapter.getCount() 方法也会返回正确数量的元素,但不会显示它们。

【问题讨论】:

    标签: android listview adapter


    【解决方案1】:

    很多人忘记拨打notifyDataSetChanged(),但你已经明白了。您是否使用自定义适配器?如果是这样,这听起来像是一个或多个适配器方法的问题。特别是,听起来getCountgetView 可能不会返回应有的内容。这可能是由于存在缺陷的逻辑问题,底层数据源没有正确更新,或者底层数据源不是您认为的同一对象。但是,如果没有看到您的适配器,则很难诊断。

    【讨论】:

    • 最初我尝试使用简单的标准适配器,而不是自定义适配器,因为它只需要显示一个字符串。这有同样的问题。然后我使用自定义适配器对其进行了重建,但无济于事。自定义适配器代码现在添加到帖子中。我也尝试过先扩展 BaseAdapter,然后再扩展 ArrayAdapter。
    【解决方案2】:

    我发现了问题。我在 LinearLayout 中有几个 CardView 对象,它本身位于 ScrollView 中。一旦我删除了 ScrollView,卡片内的列表就会正确显示。不幸的是,这又产生了另一个问题,我无法再滚动页面以查看以后的卡片,我还没有找到解决方案,但这是一个不同的主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多