Android ListAdapter启动@ top

时间:2012-12-10 20:29:13

标签: java android android-layout

目前填充的列表是从列表底部的@视图开始的。有没有办法使用listAdapters强制它到列表的顶部?

目前,方向在创建时滚动到底部。有没有办法在屏幕创建时将其固定在顶部? http://imgur.com/wGTEy在这个示例中,您看到create上的条目1被向上推,以便为六个腾出空间......相反,我希望它像这样填充。 http://imgur.com/6Lg6e ...条目1是列表的顶部,6被推到底部以进行滚动。

如果您查看上面的图片,您会发现它从列表的底部而不是顶部开始。任何想法?

mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings);
        setListAdapter(mAdapter);
        registerForContextMenu(getListView());


populateFields();

private void populateFields() {
       if (mRowId != null) {
           Cursor note = mDbHelper.fetchDaily(mRowId);
           startManagingCursor(note);
           String body = note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_DBODY));
           mAdapter.clear();
           if (!(body.trim().equals(""))){
               String bodysplit[] = body.split(",");
               for (int i = 0; i < bodysplit.length; i++) {
               mAdapter.add(bodysplit[i].trim());
               } 
           }
       }
   }

**编辑修复!=字符串错误。

2 个答案:

答案 0 :(得分:1)

您希望列表中稍后的项目位于ListView的顶部吗?如果是,请查看以下问题:Is it possible to make a ListView populate from the bottom?

答案 1 :(得分:0)

您正在彻底更改适配器,因此在此过程中滚动位置会丢失...您可以使用:

ListView listView = getListView();
int position = listView.getFirstVisiblePosition();
if (!(body.trim().equals(""))){
   String bodysplit[] = body.split(",");
   for (int i = 0; i < bodysplit.length; i++) {
      mAdapter.add(bodysplit[i].trim());
   } 
}

listView.setSelection(position);

但这并不完美,如果在position索引关闭之前添加一行。如果您的列表包含唯一值,则可以使用ArrayAdapter#getPosition()来查找新索引。


虽然我仍然建议使用CursorAdapter,因为它更好地处理大型表数据,我想用ArrayAdapter代码解决效率问题。

通过使用adapter.clear()adapter.add(),您要求ListView在每一步重绘自己...可能数十次或数百次。相反,你应该直接使用ArrayList,然后在循环完成后让ListView用ArrayAdapter#notifyDataSetChanged()重绘一次。