0

当前,填充时的列表从列表底部的视图@ 开始。有没有办法使用 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());
               } 
           }
       }
   }

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

4

2 回答 2

1

您希望列表中后面的项目位于ListView?如果是这样,请查看以下问题:是否可以从底部填充 ListView?

于 2012-12-10T20:43:28.167 回答
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,然后ArrayAdapter#notifyDataSetChanged()在循环完成后让 ListView 重绘一次。

于 2012-12-10T21:20:04.413 回答