【发布时间】:2020-01-09 17:47:33
【问题描述】:
在我的代码中有两个片段。列表页面和详细信息页面。列表页面上有很多字母项目。当我单击某些项目打开详细信息页面时。但是当我按下后退按钮时,列表不会保持相同的位置。它到达顶部。我搜索了一些解决方案,但我认为这不是常见问题。我找不到不同的答案。有人帮我吗?
【问题讨论】:
标签: java android listview android-fragments
在我的代码中有两个片段。列表页面和详细信息页面。列表页面上有很多字母项目。当我单击某些项目打开详细信息页面时。但是当我按下后退按钮时,列表不会保持相同的位置。它到达顶部。我搜索了一些解决方案,但我认为这不是常见问题。我找不到不同的答案。有人帮我吗?
【问题讨论】:
标签: java android listview android-fragments
乍一看,这似乎是您拨打的电话之一:dictionaryFragment.resetDatasource(source);
这会将您的ListView 上的Adapter 重置为全新的ArrayAdapter。这会将ListView 重置为顶部,因为适配器是一个全新的对象。 ListView 不再对旧的 ArrayAdapter 有任何想法,因此重置为顶部。
public void resetDatasource (ArrayList<String> source){
mSource=source;
adapter = new ArrayAdapter<String>(getContext(),R.layout.kelimelistesi, mSource);
dicList.setAdapter(adapter);
}
而不是调用
adapter = new ArrayAdapter<String>(getContext(),R.layout.kelimelistesi, mSource);
dicList.setAdapter(adapter);
你应该做更多这样的事情:
public class DictionaryFragment ... {
private Adapter mAdapter;
public View onCreateView(...) {
// Init the layout here
// Put some other ArrayList here if you have one initially, else an empty one to start
mAdapter = new ArrayAdapter<String>(getContext(), R.layout.kelimelistesi, new ArrayList<String>());
dicList.setAdapter(mAdapter);
}
public void resetDatasource(ArrayList<String> source) {
mAdapter.clear();
mAdapter.addAll(source);
mAdapter.notifyDataSetChanged();
}
...
}
现在的区别在于 same mAdapter 实例始终绑定到 dicList,但只有要显示的基础数据发生了变化。将 ListView/RecyclerView 的 Adapter 视为一个接受一些输入数据并将其绑定到一些 UI 元素的类。在这种情况下,ArrayAdapter 中的每个 String 都会显示在一些 UI 元素中,例如 TextView 或其他。
同样重要:请注意,我们调用notifyDataSetChanged()之后我们已经清除了旧数据并添加了所有新数据。这将有助于避免一次尝试一个元素时出现闪烁和滚动问题。
【讨论】: