2014-05-25 2 views
0

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); 
    } 

} 

Répondre

0

Pour autant que je peux comprendre que vous appelez setUpContentListStop chaque fois que le fichier dans le cache a changé (onFileInCacheChanged) .

Dans la méthode setUpContentListStop, vous créez et définissez l'adaptateur de la vue de liste à chaque fois: mListView.setAdapter(new StopListAdapter(getActivity(), mLine.getListStops()));. Au lieu de cela, vous pouvez créer l'adaptateur une fois (dans onCreateView) et mettre à jour ses données lorsque de nouvelles données sont disponibles.

EDIT

Si votre StopListAdapter étend BaseAdapter vous pouvez créer une méthode supplémentaire pour ajouter un nouvel élément dans la liste des objets.

public void add(Object item) { 
    list.add(item); 
    notifyDataSetChanged(); 
} 

Et appeler cette méthode dans votre méthode setUpContentListStop comme adapter.add(mLine.getListStops()))

+0

Oui, vous comprenez, mais comment je peux mettre à jour les données dans l'adaptateur? – Guillaume

+0

Quel type d'adaptateur 'StopListAdapter' est? –

+0

Il étend 'BaseAdapter' – Guillaume

Questions connexes