我在一个片段中有一个ListView,其中包含在网上下载的数据。我将数据保存在缓存中,这样我就可以显示信息,直到对服务器的请求完成为止。
问题是当我向下滚动列表视图开始向下滚动时,几秒后它会自动转到顶部,所以我无法选择列表底部的元素,因为我没有时间。
listView的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ProgressBar
android:id="@+id/progressbar_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:indeterminate="true"/>
<ListView
android:id="@+id/list_stop"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:visibility="invisible"
android:divider="@color/divider_color"
android:dividerHeight="1dp" />
</LinearLayout>
使用listView的片段
public class LineFragment extends Fragment implements RestoreActionBar {
private static final String ARG_LINE_NAME = "line_name";
private static final String ARG_LINE_COLOR = "line_color";
/**
* A pointer to the current callbacks instance (the Activity).
*/
private LineFragmentCallbacks mCallbacks;
private Line mLine;
private ProgressBar mProgressBar;
private ListView mListView;
private DownloadToCache mDownloadToCacheAsyncTask = null;
/**
* Returns a new instance of this fragment for the given line
* name.
*/
public static LineFragment newInstance(String lineName, String lineColor) {
LineFragment fragment = new LineFragment();
Bundle args = new Bundle();
args.putString(ARG_LINE_NAME, lineName);
args.putString(ARG_LINE_COLOR, lineColor);
fragment.setArguments(args);
return fragment;
}
public LineFragment() {
mLine = null;
};
@Override
public void onDestroy() {
super.onDestroy();
if (mDownloadToCacheAsyncTask != null)
mDownloadToCacheAsyncTask.cancel(true);
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mDownloadToCacheAsyncTask != null)
mDownloadToCacheAsyncTask.cancel(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_line, container, false);
mProgressBar = (ProgressBar) rootView.findViewById(R.id.progressbar_line);
mListView = (ListView) rootView.findViewById(R.id.list_stop);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
selectItem(position);
}
});
setUpContentListStop(false);
return rootView;
}
private void selectItem(int position) {
if (mListView != null) {
mListView.setItemChecked(position, true);
}
if (mCallbacks != null) {
mCallbacks.onLineFragmentItemSelected(position);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (LineFragmentCallbacks) activity;
File jsonFile = new File(activity.getCacheDir()
+ getArguments().getString(ARG_LINE_NAME)
+ ".json");
if (jsonFile.exists()) {
mLine = new Line(jsonFile);
}
((MainActivity) activity).onSectionAttached(
getArguments().getString(ARG_LINE_NAME),
getArguments().getString(ARG_LINE_COLOR));
((MainActivity) activity).restoreActionBar();
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
@Override
public void restoreActionBar(Activity activity) {
if (mListView != null) {
mListView.setItemChecked(mListView.getCheckedItemPosition(), false);
}
((MainActivity) activity).setActionBarProperty(
getArguments().getString(ARG_LINE_NAME),
Color.parseColor(getArguments().getString(ARG_LINE_COLOR)));
}
private void onFileInCacheChanged() {
setUpContentListStop(true);
}
/**
* Set up the content of the list
* @param downloaded true if the json has been download
*/
private void setUpContentListStop(boolean downloaded) {
if (getActivity() == null)
return;
if (Network.isConnected(getActivity())) {
mDownloadToCacheAsyncTask = new DownloadToCache();
mDownloadToCacheAsyncTask.execute(
getArguments().getString(ARG_LINE_NAME) + ".json",
Line.URL_LINE_INFO);
}
File jsonFile = new File(getActivity().getCacheDir() + "/"
+ getArguments().getString(ARG_LINE_NAME)
+ ".json");
if (jsonFile.exists()) {
mLine = new Line(jsonFile);
return;
}
mListView.setAdapter(new StopListAdapter(getActivity(), mLine.getListStops()));
mListView.setVisibility(View.VISIBLE);
}
}
/* -------------AsyncTask class------------ */
private class DownloadToCache extends AsyncTask<String, Void, Boolean> {
}
/**
* Callbacks interface that all activities using this fragment must implement.
*/
public static interface LineFragmentCallbacks {
/**
* Called when an item in the list is selected.
*/
void onLineFragmentItemSelected(int position);
}
}
答案 0 :(得分:0)
据我所知,每次缓存中的文件发生更改(setUpContentListStop
)时,您都会调用onFileInCacheChanged
。
每次在setUpContentListStop
方法中创建并设置列表视图的适配器:mListView.setAdapter(new StopListAdapter(getActivity(), mLine.getListStops()));
。相反,您可以创建一次适配器(在onCreateView
中)并在新数据可用时更新其数据。
修改强>
如果StopListAdapter
扩展BaseAdapter
,您可以创建另一种方法,在对象列表中添加新项目。
public void add(Object item) {
list.add(item);
notifyDataSetChanged();
}
并在您的setUpContentListStop
方法中调用此方法,例如adapter.add(mLine.getListStops()))