我搜索了这些论坛近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()方法也会返回正确数量的元素,但不会显示它们。
答案 0 :(得分:1)
很多人忘了做notifyDataSetChanged()
电话,但你已经有了。您使用的是自定义适配器吗?如果是这样,这听起来像是一个或多个适配器方法的问题。特别是,听起来getCount
或getView
可能不会返回它们应该是什么。这可能是因为逻辑问题存在缺陷,底层数据源未正确更新,或者底层数据源与您认为不是同一个对象。虽然没有看到你的适配器,但很难诊断。
答案 1 :(得分:0)
我发现了问题。我在LinearLayout中有几个CardView对象,它本身就在ScrollView中。一旦我删除了ScrollView,卡内的列表就会正常显示。不幸的是,这已经产生了另一个问题,因为我无法再滚动页面以查看后来的卡片,我还没有找到解决方案,但这是一个不同的主题。