2014-09-26 61 views
0

我正在構建一個像techcrunch一樣的應用程序。我從JSON格式的服務器獲取數據,並在列表視圖中顯示數據,如文章標題,作者姓名和圖像。當用戶在列表視圖中滾動更多文章時,我應用了分頁方式。我的分頁工作正常,但滾動功能存在問題,因爲新數據或新數據加載的滾動劑量與數據不一致。爲了澄清更簡單的話我的滾動兒去的時候我其實向下滾動此頁面的頂部是我的代碼:如何在列表視圖中實現正確的滾動以在分段活動上實現分頁?

public class OneFragment extends Fragment { 

public OneFragment(){} 
private static final String TAG = OneFragment.class.getSimpleName(); 

// Movies json url 
private static String URL = "http:url&page=1"; 
private ProgressDialog pDialog; 
private List<Movie> movieList = new ArrayList<Movie>(); 
private ListView listView; 
private CustomListAdapter adapter; 
int current_page = 1; 
int mPreLast; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    final View rootView = inflater.inflate(R.layout.swip, container, false); 

    pDialog = new ProgressDialog(getActivity()); 
    pDialog.setMessage("Loading..."); 
    pDialog.show(); 
    pDialog.setCancelable(false); 


    listView = (ListView) rootView.findViewById(R.id.list49); 
    listView.setOnScrollListener(new AbsListView.OnScrollListener() 
    { 
     @Override 
     public void onScrollStateChanged(AbsListView absListView, int i) 
     { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
     { 
      int lastItem = firstVisibleItem + visibleItemCount; 
       if(lastItem == totalItemCount){ 
        if (mPreLast != lastItem) 
        { 
         mPreLast = lastItem; 
         onStart(); 

        } 
      } 
     } 
    }); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int Position, 
       long offset) { 
      // TODO Auto-generated method stub 
      Movie item = (Movie) adapter.getItem(Position);    
      Intent intent = new Intent(rootView.getContext(), SingleArticle.class); 
      single.date = item.getDate(); 
      single.id = item.getId(); 


      startActivity(intent); 


      }   
     }); 
    //pDialog = new ProgressDialog(this); 
    // Showing progress dialog before making http request 

    return rootView; 
} 

@Override 
public void onStart(){ 
    super.onStart(); 
    // calling adapter changes here, just 
    // to avoid getactivity()null 
    // increment current page 
    current_page += 1; 

    // Next page request 
    URL = "http:url&page=" + current_page; 
    //adapter = new CustomListAdapter(this, movieList); 

    // changing action bar color 
    //getActivity().getActionBar().setBackground(
      //new ColorDrawable(Color.parseColor("#1b1b1b"))); 

    // Creating volley request obj 
    JsonArrayRequest movieReq = new JsonArrayRequest(URL, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, response.toString()); 
        hidePDialog(); 

        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          Movie movie = new Movie(); 
          movie.setDate(obj.getString("date")); 
          movie.setId(obj.getString("id")); 

          movieList.add(movie); 
          int currentPosition = listView.getFirstVisiblePosition(); 

          adapter = new CustomListAdapter(getActivity(), movieList); 
          adapter.notifyDataSetChanged(); 

          listView.setAdapter(adapter); 
          listView.setSelectionFromTop(currentPosition + 1, 0); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        }      
       } 
      },new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        new AlertDialog.Builder(getActivity()) 
        .setTitle("No Connectivity ") 
        .setMessage("Please check your internet connectivity!") 
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          // continue with delete 
         } 
        }) 
        //.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
         //public void onClick(DialogInterface dialog, int which) { 
          // do nothing 
         //} 
        //}) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .show(); 
        hidePDialog(); 

       } 
      }); 
    AppController.getInstance().addToRequestQueue(movieReq);  
    listView.setAdapter(adapter); 

} 

private View getActionBar() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onDestroy() { 
super.onDestroy(); 
hidePDialog(); 
} 

private void hidePDialog() { 
if (pDialog != null) { 
    pDialog.dismiss(); 
    pDialog = null; 
} 
} 

} 

回答

0

你可以試試這個(我加一條線,設置新的列表中的位置在調用onStart())

的最後一行有了這條線,你可以設置新position_

listView.setSelectionFromTop(newPosition, 0); 您設定的位置,第一個參數,並與第二你的頂部設置distnace列表

@Override 
public void onStart(){ 
super.onStart(); 
// calling adapter changes here, just 
// to avoid getactivity()null 
// increment current page 
current_page += 1; 

// Next page request 
URL = "http:url&page=" + current_page; 
//adapter = new CustomListAdapter(this, movieList); 

// changing action bar color 
//getActivity().getActionBar().setBackground(
     //new ColorDrawable(Color.parseColor("#1b1b1b"))); 

// Creating volley request obj 
JsonArrayRequest movieReq = new JsonArrayRequest(URL, 
     new Response.Listener<JSONArray>() { 
      @Override 
      public void onResponse(JSONArray response) { 
       Log.d(TAG, response.toString()); 
       hidePDialog(); 

       // Parsing json 
       for (int i = 0; i < response.length(); i++) { 
        try { 

         JSONObject obj = response.getJSONObject(i); 
         Movie movie = new Movie(); 
         movie.setDate(obj.getString("date")); 
         movie.setId(obj.getString("id")); 

         movieList.add(movie); 
         int currentPosition = listView.getFirstVisiblePosition(); 

         adapter = new CustomListAdapter(getActivity(), movieList); 
         adapter.notifyDataSetChanged(); 

         listView.setAdapter(adapter); 
         listView.setSelectionFromTop(currentPosition + 1, 0); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       }      
      } 
     },new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       new AlertDialog.Builder(getActivity()) 
       .setTitle("No Connectivity ") 
       .setMessage("Please check your internet connectivity!") 
       .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         // continue with delete 
        } 
       }) 
       //.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
        //public void onClick(DialogInterface dialog, int which) { 
         // do nothing 
        //} 
       //}) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .show(); 
       hidePDialog(); 

      } 
     }); 
AppController.getInstance().addToRequestQueue(movieReq);  
listView.setAdapter(adapter); 
//Set the new position 
listView.setSelectionFromTop(currentPosition + 1, 0); 
} 
相關問題