Android保留listview的上一个滚动位置

时间:2015-04-20 06:11:48

标签: android listview android-listview

我的listview有问题。我的listview有一个自定义适配器。它从服务器获取记录。我使用AsyncTask来获取记录并显示在列表视图中。

但是,当我单击listview项目以显示详细信息并返回列表活动时,它会滚动到顶部并刷新列表视图。

这是我的代码:

 protected void onPostExecute(String result) {

            progressBar.setVisibility(View.GONE);

            if (isSwiped) {
                // reset
                isSwiped = false;
            }

            if (result != null && tag == 1) {
                adapter = new SharedBibleVersesAdapter(SharedBibleVersesActivity.this,
                        SharedBibleVersesActivity.this);
                lv.setAdapter(adapter);
                adapter.notifyDataSetChanged();


    }


 @Override
 public void onResume() {
    super.onResume();
    displayRecords();
 }

public void displayRecords() {

    if(ConnectionDetector.hasNetworkConnection(this)) {
        DisplayAsyncTask displayTask = new DisplayAsyncTask();
        displayTask.execute();
    } else {
        progressBar.setVisibility(View.GONE);
        tvHeader.setVisibility(View.VISIBLE);
            tvHeader.setText(
                    getResources().getString(R.string.no_internet_connection));

    }

}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tvTitle.setText(getResources().getString(R.string.shared_bible_verses));
    tvHeader = (MyTextView) findViewById(R.id.tvHeader);
    lv = (ListView) findViewById(R.id.listView);
    progressBar = (ProgressWheel) findViewById(R.id.progressBar);
    displayRecords();

}

为什么它滚动到顶部的任何想法?我很乐意感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:0)

它会滚动到顶部,因为您再次设置适配器...

使用:

if (adapter == null) {
    adapter = new SharedBibleVersesAdapter(SharedBibleVersesActivity.this, SharedBibleVersesActivity.this, itemList, userAPIkey, userId);
    lv.setAdapter(adapter);
} else {
     adapter.notifyDataSetChanged();
}

答案 1 :(得分:0)

我在我的一个旧项目中使用了以下内容,在onSaveInstanceState添加了此代码并且它有效:

// save index and top position
int index = listView.getFirstVisiblePosition();
View view = listView.getChildAt(0);
int top = (view == null) ? 0 : view.getTop();

然后将其保存在SharedPreferences中,以便您可以返回相同的位置:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
        Editor edit = sp.edit();
        edit.putString(key1, index);
        edit.putString(key2, top);
        edit.commit();

您可以通过从ListView检索数据来设置SharedPreferences的先前状态,例如:

SharedPreferences sp =PreferenceManager.getDefaultSharedPreferences(getActivity());     
String _index = sp.getString("INDEX1", saved_index);
String _top = sp.getString("TOP1", saved_top);

然后在setAdapter

之后使用此功能
listView.setSelectionFromTop(Integer.parseInt(_index), Integer.parseInt(_top));

注意: onSaveInstanceState()是用于在暂停活动之前存储数据的方法。

答案 2 :(得分:0)

请在<ListView>文件

中的AndroidManifest.xml元素中添加属性
android:transcriptMode 

值:

  1. 已停用 - 0:已停止滚动
  2. 普通 - 1:如果用户可以看到列表中的最后一项,那么当通过notifyDataSetChanged()调用在底部添加新项目时,列表视图将滚动显示此项目
  3. alwaysScroll - 2:无论最后一项对用户是否可见,列表都会滚动到底部
  4. 您的情况,normal是正确的值,它将解决您的问题

答案 3 :(得分:0)

保存您点击的索引并在以后使用

lv.setSelection(index);
相关问题