【发布时间】: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() 方法也会返回正确数量的元素,但不会显示它们。
【问题讨论】: