2014-05-25 117 views
0

我有一個包含在網上下載數據的片段中的ListView。我將數據保存在緩存中,以便能夠顯示信息,直至完成對服務器的請求。無法正確滾動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

至於我能理解每個高速緩存中的文件改變時,您所呼叫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()))

+0

是的,你明白調用此方法,但我怎麼可以更新適配器的數據? – Guillaume

+0

什麼樣的適配器'StopListAdapter'是? –

+0

它擴展了'BaseAdapter' – Guillaume