現在,我確信這聽起來會讓很多人感到奇怪,但是我的ListView在旋轉我的設備時始終保持其位置。這並不是說這是一個特別糟糕的行爲(這是我最終的目標,當用戶旋轉他們的設備時記得ListView的位置),更重要的是似乎沒有原因爲什麼它正在保留的位置。我從來沒有告訴過它這樣做!即使當我嘗試強制更改ListView上的自定義適配器時,它也會更新(列表項)內的信息,但仍保留該元素的位置。在改變片段中的方向時總是保留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()',你可以發佈它的代碼? – 2014-10-09 22:59:13
當然!我只是將它添加到主帖子中。 – Michael 2014-10-09 23:07:29
爲什麼從'onCreateView()'調用'super.onCreate()'? – 2014-10-09 23:11:34