【发布时间】:2014-10-09 22:40:55
【问题描述】:
现在,我确信这对许多人来说听起来很奇怪,但是我的 ListView 在旋转我的设备时始终保持其位置存在问题。这并不是一个特别糟糕的行为(这是我的最终目标,当用户旋转他们的设备时让它记住 ListView 的位置),更多的是似乎没有理由 why 它保留了位置。我从来没有告诉它这样做!即使我尝试强制更改 ListView 上的自定义适配器,它也会更新内部信息(列表项),但仍保留元素的位置。
经过进一步测试,如果我尝试做一个延迟的Runnable(大约300ms延迟),我可以成功改变ArrayAdapter并且位置如预期重置到顶部。
为什么在Fragment创建期间(onCreateView、onActivityCreated等)强制ListView改变位置?
这里有一些代码:
public class MainFragment extends Fragment {
ListView list;
ArrayList<String> skinslist;
ArrayList<File> files;
ArrayList<Integer> heights;
File directory;
String[] listitems;
LinearLayout skin_list_error;
SkinListAdapter adapter;
SwipeRefreshLayout swipeLayout;
View view;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
listitems = getResources().getStringArray(R.array.TestStrings);
list = (ListView) view.findViewById(R.id.skin_list);
skin_list_error = (LinearLayout) view.findViewById(R.id.skin_list_error);
//Initialize list items
if (isExternalStorageWritable() && isExternalStorageReadable()) {
directory = new File(Environment.getExternalStorageDirectory());
//File directory = new File(getActivity().getFilesDir(), "Mine");
directory.mkdir();
CreateNoMediaFile.CreateNoMedia(directory);
File[] filedirectory = directory.listFiles();
Arrays.sort(filedirectory, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f2.lastModified()).compareTo(f1.lastModified());
} });
skinslist = new ArrayList<String>();
files = new ArrayList<File>();
heights = new ArrayList<Integer>();
for (File f : filedirectory) {
String filename = f.getName();
if (filename.endsWith(".png")) {
skinslist.add(f.getName().substring(0, filename.length() - 4));
files.add(f);
}
}
listitems = skinslist.toArray(new String[skinslist.size()]);
adapter = new SkinListAdapter(this.getActivity(), listitems, files, heights);
list.setAdapter(adapter);
} else {
Toast.makeText(getActivity(), "Error: Couldn't access phone storage", Toast.LENGTH_LONG).show();
list.setVisibility(ListView.GONE);
skin_list_error.setVisibility(LinearLayout.VISIBLE);
}
//Finish initializing list items
swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
swipeLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
refreshSkins(false);
}
});
swipeLayout.setColorScheme(R.color.refresh_initial_color,
R.color.refresh_initial_color,
R.color.refresh_initial_color,
R.color.refresh_initial_color);
}
这里是视图膨胀的地方:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.skinlist, container, false);
return view;
}
【问题讨论】:
-
你在哪里给
view赋值?我想在onCreateView(),你能把它的代码贴出来吗? -
当然!我刚刚将它添加到主帖中。
-
你为什么从
onCreateView()打电话给super.onCreate()? -
嗯...我认为这是必要的。我将其删除并再次尝试(仅作为测试)。遗憾的是,结果相同。
-
@Phascinate 我认为问题是由于调用了错误的超类(
super.onCreate()vssuper.onCreateView())
标签: android