列表视图数据模型已更新,但项目未显示

时间:2014-12-18 19:38:45

标签: android listview adapter

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

我有一个活动,有多个卡片视图。其中一个卡片视图有一个带有字符串值的Spinner和一个非常简单的ListView。用户从Spinner中选择一个介于1和12之间的值。然后,ListView应根据微调器列表中的位置显示一些等于所选值的字符串。例如,用户在微调框列表中选择第二项,ListView显示2个字符串。我在listview上有一个自定义适配器。 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()方法也会返回正确数量的元素,但不会显示它们。

2 个答案:

答案 0 :(得分:1)

很多人忘了做notifyDataSetChanged()电话,但你已经有了。您使用的是自定义适配器吗?如果是这样,这听起来像是一个或多个适配器方法的问题。特别是,听起来getCountgetView可能不会返回它们应该是什么。这可能是因为逻辑问题存在缺陷,底层数据源未正确更新,或者底层数据源与您认为不是同一个对象。虽然没有看到你的适配器,但很难诊断。

答案 1 :(得分:0)

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

相关问题