相关疑难解决方法(0)

一劳永逸,如何在后台堆栈中正确保存Fragments的实例状态?

我在SO上发现了许多类似问题的实例,但遗憾的是没有答案符合我的要求.

我有纵向和横向的不同布局,我正在使用后台堆栈,这两个都阻止我setRetainState()使用配置更改例程使用和技巧.

我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中.仅使用活动编写我的应用程序时,以下工作正常:

TextView vstup;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whatever);
    vstup = (TextView)findViewById(R.id.whatever);
    /* (...) */
}

@Override
public void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putCharSequence(App.VSTUP, vstup.getText());
}

@Override
public void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    vstup.setText(state.getCharSequence(App.VSTUP));
}
Run Code Online (Sandbox Code Playgroud)

使用Fragments,这仅适用于非常特定的情况.具体来说,可怕的破坏是替换片段,将其放入后栈,然后在显示新片段时旋转屏幕.根据我的理解,旧片段onSaveInstanceState()在被替换时没有接收到调用但是以某种方式Activity与之相关联,并且此方法稍后在其View不再存在时调用,因此将我TextView的任何结果查找为a NullPointerException.

另外,我发现保留对我的引用对于s TextViews来说并不是一个好主意Fragment,即使它是正常Activity的.在这种情况下,onSaveInstanceState()实际上保存状态但是如果我在隐藏片段时旋转屏幕两次,则问题会重新出现,因为它onCreateView()不会在新实例中被调用.

我想把状态保存onDestroyView()到某个Bundle类型的类成员元素中(它实际上是更多的数据,而不仅仅是一个TextView)并保存,onSaveInstanceState()但还有其他缺点.首先,如果该片段当前显示,调用两个函数的顺序是相反的,所以我需要考虑两种不同的情况.必须有一个更清洁,更正确的解决方案!

android android-fragments

465
推荐指数
5
解决办法
27万
查看次数

RecyclerView存储/恢复活动之间的状态

我正在将ListViews迁移到RecyclerViews.使用listviews,我使用此处描述的常用技术来存储和恢复活动之间的滚动位置.

如何使用RecyclerViews做同样的事情?在RecyclerView.onSaveInstanceState()似乎有protected访问权限,因此无法直接使用.

android listview android-recyclerview

64
推荐指数
4
解决办法
6万
查看次数

调用notifyDataSetChanged后,在ListView中保留位置

我正在使用OnScrollListener在用户滚动到底部时动态地将项添加到ListView.在我将数据添加到适配器并调用notifyDataSetChanged后,ListView返回到顶部.理想情况下,我想保留ListView中的位置.关于我应该怎么做的任何想法?

android listview

42
推荐指数
2
解决办法
3万
查看次数

Android在ListView中获得精确的滚动位置

我想获得ListView滚动的精确像素位置.不,我不是指第一个可见的位置.

有没有办法实现这个目标?

android android-listview

38
推荐指数
5
解决办法
7万
查看次数

Android ListView当前滚动位置Y像素

我试图检测列表视图何时滚动超过某个固定阈值(以像素为单位)(第一项的一半).不幸的是listview的getScrollY()似乎总是返回滚动位置的0个instad.有没有办法按像素获取实际的滚动位置?

这是我试图使用的代码,但据说它只返回0.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() {
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {
        Log.d("scroll", "scroll: " + getListView().getScrollY());
    }

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == 0)
        Log.d("scroll", "scrolling stopped");
    }
});
Run Code Online (Sandbox Code Playgroud)

android listview scroll scroll-offset

29
推荐指数
1
解决办法
4万
查看次数

有没有办法阻止列表视图在其适配器的数据更改时滚动到其顶部位置?

在更改它的适配器数据时,我在保留列表视图的滚动位置时遇到了一些麻烦.

我目前正在做的是在onCreateListFragment中创建一个自定义ArrayAdapter(带有重写的getView方法),然后将其分配给它的列表:

mListAdapter = new CustomListAdapter(getActivity());
mListAdapter.setNotifyOnChange(false);
setListAdapter(mListAdapter);
Run Code Online (Sandbox Code Playgroud)

然后,当我从定期获取一切装载机接收新的数据,我这样做是在其onLoadFinished回调:

mListAdapter.clear();
mListAdapter.addAll(data.items);
mListAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

问题是,调用clear()重置listview的滚动位置.删除该调用会保留该位置,但它显然会将旧项目留在列表中.

这样做的正确方法是什么?

android

20
推荐指数
2
解决办法
2万
查看次数

使用反向无限滚动添加到ListView时保持滚动位置

我正在构建类似聊天的Android应用程序,类似于环聊.为此,我使用带有stackFromBottom=true和的垂直ListView transcriptMode="normal".

该列表从较旧的消息(顶部)到较年轻的消息(底部)排序.在正常状态下,ListView会滚动到底部,显示最年轻的消息.

一旦用户滚动到列表顶部,ListView使用反向无限滚动适配器来加载更多(较旧的)消息.加载旧邮件后,它们将添加到列表顶部.

所需的行为是,当旧消息添加到其顶部时,ListView将其滚动位置保持在列表的底部.也就是说,当较旧的消息添加到顶部时,滚动视图应显示在添加旧消息之前显示的相同消息.

不幸的是,这不起作用.ListView不是将滚动位置保持在底部,而是将滚动位置保持在列表顶部.也就是说,在将较旧的消息添加到列表之后,该列表显示最顶层(即最旧的)消息.

在将新项目添加到顶部时,是否有一种简单的方法可以告诉ListView将其滚动位置保持在底部而不是顶部?

更新

出于演示目的,我尽可能地减少了用例和代码.以下示例创建一个简单的字符串数组列表.单击某个项目将在列表顶部添加另一个项目.长按单击某个项目将在列表底部添加另一个项目.

在列表底部添加项目时,一切正常(长按).在列表顶部添加项目(简单点击),则有3种情况:

  • 如果列表滚动到底部,那么一切正常.将项目添加到顶部后,列表仍会滚动到底部.
  • 如果列表未滚动到底部(也不滚动到顶部),则列表将保持其滚动y位置(从顶部开始).这使列表看起来"跳"了一个项目.我希望列表不要在这种情况下"跳起来",即我希望它从底部保持其滚动y位置.
  • 如果列表滚动到顶部,则情况与情况2相同.首选行为与情况2相同.

(最后两个案例实际上是相同的.我把它们分开了,因为在案例2中可以更好地证明这个问题.)

public class MyListActivity extends Activity {
  int topIndex = 1;

  int bottomIndex = 20;

  protected final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_list_activity);

    final ListView list = (ListView) findViewById(R.id.list);
    list.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
    list.setStackFromBottom(true);

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1);
    for (int i = topIndex; i <= bottomIndex; i++) {
      adapter.add(Integer.toString(i));
    }
    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> …
Run Code Online (Sandbox Code Playgroud)

android listview scroll endlessadapter

17
推荐指数
1
解决办法
5051
查看次数

返回活动时如何保留Android ListView滚动位置?

可能重复:
返回ListView时保持/保存/恢复滚动位置

用户查看项目的列表视图,它们移动到显示一个项目的详细信息的活动,然后单击"返回"并返回到列表活动,但我希望列表反映其先前的滚动位置.

我应该将滚动位置存储为onPause中活动的成员变量还是有更好的方法?

android

13
推荐指数
1
解决办法
1万
查看次数

如何在ExpandableListView中保留滚动位置

在我的应用程序中,我有一个派生自ExpandableListActivity的类.当我滚动内容,然后更改手机方向或编辑项目,然后返回列表时,不保留原始列表位置.我尝试了两种解决方案,类似于我最近成功使用ListActivity派生类的解决方案.

解决方案1:

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    mListState = state.getParcelable(LIST_STATE);
}

protected void onResume() {
    super.onResume();
    loadData();
    if (mListState != null)
        getExpandableListView().onRestoreInstanceState(mListState);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    mListState = getExpandableListView().onSaveInstanceState();
    state.putParcelable(LIST_STATE, mListState);
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    mListPosition = state.getInt(LIST_STATE);
}

protected void onResume() {
    super.onResume();
    loadData();
    getExpandableListView().setSelection(mListPosition);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    mListPosition = getExpandableListView().getFirstVisiblePosition();
    state.putInt(LIST_STATE, mListPosition);
}
Run Code Online (Sandbox Code Playgroud)

两种解决方案都无效.我也尝试将两种解决方案结合起来,这在我编辑项目并返回列表时起作用,但是当我改变手机方向时它不起作用

任何人都可以建议一个实现目标的好方法吗?

android

13
推荐指数
2
解决办法
1万
查看次数

如何保持ListView的位置

可能重复:
返回ListView时保持/保存/恢复滚动位置

当我去另一个活动(通过启动另一个意图)然后回来(按后退按钮)时,如何在我的活动中保持ListView的位置?

谢谢.

android

10
推荐指数
3
解决办法
2万
查看次数