J'ai un ListView dans un fragment contenant des données à télécharger sur le net. Je garde les données dans le cache afin que je puisse afficher les informations jusqu'à ce que la requête au serveur soit terminée. Le problème est que lorsque je fais défiler la liste vers le bas pour défiler vers le bas et après quelques secondes, il va automatiquement en haut, donc je ne peux pas sélectionner l'élément en bas de la liste parce que je n'ai pas le temps.Impossible de faire défiler ListView correctement
La mise en page du 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>
Le fragment qui utilisent le 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);
}
}
Oui, vous comprenez, mais comment je peux mettre à jour les données dans l'adaptateur? – Guillaume
Quel type d'adaptateur 'StopListAdapter' est? –
Il étend 'BaseAdapter' – Guillaume