我有一个通过 Handler postDelayed() 方法每 2 秒刷新一次的列表。
每 2 秒运行一次 AsyncTask,它发出一个 HTTP GET 请求,将 JSON 转换为对象列表,然后设置 ListAdapter:
MyListAdapter adapter = new MyListAdapter(someObjects);
setListAdapter(adapter);
我的问题是每次任务完成时(因此,大约每两秒钟)我的列表会跳回顶部,即使我已经向下滚动到列表的中间或底部。这对最终用户来说会很烦人,所以我需要在后台更新列表,就像它正在做的那样,但是列表的当前视图在 AsyncTask 完成时不会跳回顶部。
我可以包含更多需要的代码。我对android开发有点陌生,所以我不确定什么对其他人有帮助。
附加信息
接受 hacksteak25 的建议,我能够尝试从适配器中删除所有数据,然后一次将其添加回一个对象。这不是最终解决方案,因为这可能仍会导致屏幕跳跃,但我试图将其用作我如何在某个时候合并数据的概念证明。
我的问题是我调用以下代码:
MyListAdapter adapter = (MyListAdapter)getListAdapter();
adapter.clear();
for(MyObject myObject : myObjects)
{
adapter.add(myObject);
}
在第一次调用“add(myObject)”之后,将调用 MyListAdapter 的 getView() 方法。此时自定义适配器的私有内部 ArrayList 为空,要么是因为我在 onCreate() 中设置了没有 myObjects 的适配器,要么是因为我在适配器上调用了 clear(),我不确定。无论哪种方式,这都会导致 getView 失败,因为 ArrayList 中没有要从中获取视图的对象。
getView() 看起来像这样:
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
LayoutInflater mInflater = getLayoutInflater();
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.myObject, null);
holder = new ViewHolder();
holder.someProperty = (TextView)convertView.findViewById(R.id.someProperty);
holder.someOtherProperty = (TextView)convertView.findViewById(R.id.someOtherProperty);
holder.someOtherOtherProperty = (TextView)convertView.findViewById(R.id.someOtherOtherProperty);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
// Bind the data efficiently with the holder.
holder.someProperty.setText( mObjects.get(position).getSomeProperty());
...
最后一行是导致 IndexOutOfBoundsException 的那一行。
我应该如何处理这种情况,在那里我得到我想要的数据而不导致列表跳转?