2014-01-09 9 views
4

В MainActivity Я создаю DownloadTask, который заполняет класс модели, а затем listview через класс CustomListAdapter, но я создал функцию для распознавания конца прокрутки, и я хочу загрузить больше элементов в список. Я читал и смотрел код в Интернете, но я не могу понять, как это решить, потому что его вид отличается. MainActivity классListView загружается больше на нижней части прокрутки

public void updateList() { 
     adap = new CustomListAdapter(this, feedList, null); 

     feedListView.setAdapter(adap); 
     feedListView.setOnScrollListener(new OnScrollListener() { 

      public void onScrollStateChanged(AbsListView view, 
        int scrollState) { // TODO Auto-generated method stub 
       int threshold = 1; 
       int count = feedListView.getCount(); 

       if (scrollState == SCROLL_STATE_IDLE) { 
        if (feedListView.getLastVisiblePosition() >= count 
          - threshold) { 
         mHandler = new Handler(); 
         mIsLoading = true; 


       Toast.makeText(getApplicationContext(), "END", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 

      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 


      } 

     }); 


    } 


    public class DownloadFilesTask extends AsyncTask<String, Integer, Void> { 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
       if (null != feedList) { 
         updateList(); 
       } 

       if (progressbar.isShown()) { 
        progressbar.setVisibility(View.INVISIBLE); 
       } 

     } 

     @Override 
     protected Void doInBackground(String... params) { 
       String url = params[0]; 

       // getting JSON string from URL 
       JSONObject json = getJSONFromUrl(url); 

       //parsing json data 
       parseJson(json); 
       return null; 
     }} 
     public JSONObject getJSONFromUrl(String url) { 
     InputStream is = null; 
     JSONObject jObj = null; 
     String json = null; 

     // Making HTTP request 
     try { 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(
           is, "iso-8859-1"), 8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
       } 
       is.close(); 
       json = sb.toString(); 
     } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 

     try { 
       jObj = new JSONObject(json); 
     } catch (JSONException e) { 
       Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 

    public void parseJson(JSONObject json) { 
     try { 

       // parsing json object 
       if (json.getString("status").equalsIgnoreCase("ok")) { 
         JSONArray posts = json.getJSONArray("posts"); 




         feedList = new ArrayList<FeedItem>(); 

         for (int i = 0; i < posts.length(); i++) { 

           JSONObject post = (JSONObject) posts.getJSONObject(i); 
           FeedItem item = new FeedItem(); 

           /////..... 
           feedList.add(item); 



         } 

         } 



     } catch (JSONException e) { 
       e.printStackTrace(); 
     } 
    } 

CustomListAdapter

public class CustomListAdapter extends BaseAdapter 
{ 



    private int mCount = 25; 
    private ArrayList<FeedItem> listData; 
    private LayoutInflater layoutInflater; 
    private Context mContext; 
    private ArrayList<String> data; 
    protected ListView feedListView; 

    public CustomListAdapter(Context context, ArrayList<FeedItem> listData) 
    { 


     this.listData = listData; 
     layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mContext = context; 

    } 

    public void addMoreItems(int count) { 
     mCount += count; 
     notifyDataSetChanged(); 
    } 


    @Override 
    public int getCount() 
    { 
     return mCount; 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 


    public View getView(int position, View convertView, ViewGroup parent) 
    { 
    final ViewHolder holder; 
    View row=convertView; 
     if ((row == null) || (row.getTag()==null)) { 

     convertView = layoutInflater.inflate(R.layout.list_row_layout, null); 
     holder = new ViewHolder(); 
     //// 
     convertView.setTag(holder); 






     } 
     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 

     } 

     final FeedItem newsItem = (FeedItem) listData.get(position); 
     ///// 



     return convertView; 
    } 


static class ViewHolder 
    { 
     //// 
    } 


} 

Когда я достигнет дна создается тост.

ответ

1

Вместо использования OnScrollListener вы можете сравнить позицию, чтобы отобразить размер данных и загрузить больше элементов в пределах вашего класса адаптера.

public View getView(int position, View convertView, ViewGroup parent){ 
    if(position == getCount()-1){ 
    // load new items here. you can do a for loop here, if you'd like to add multiple items. 
    addMoreItems(newItem); 
    } 

    // rest of the getView implementation 
} 

И вам также необходимо обновить следующие методы:

public void addMoreItems(FeedItem newItem) { 
    listData.add(newItem); // since you want to add this item at the end of the list 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount(){ 
    return listData.size(); 
} 

@Override 
public Object getItem(int position){ 
    return listData.get(position); 
} 

не создавать новый адаптер, когда вы хотите обновить ListView, как вы делали в вашем методе обновления. Если вы это сделаете, он избавится от предыдущего контента. Вместо этого просто вызовите метод addMoreItems вашего адаптера, он сделает трюк для вас.

+0

Можете ли вы дать мне пример? Я новичок в Android, поэтому я не знаю, как это сделать. –

+0

Я отредактировал свой ответ и добавил образец/псевдокод. Дайте мне знать, если это недостаточно ясно. – ayorhan

+0

Но как я могу добавить NewData? Как вы видели, я ограничил элементы частным int mCount = 25; в Adapter –

1
 @Override 
     public void onScrollStateChanged(int scrollState) { 
      // TODO Auto-generated method stub 

      if(scrollState==RecyclerView.SCROLL_STATE_IDLE){ 

        visibleItemCount = mLayoutManager.getChildCount(); 
        totalItemCount = mLayoutManager.getItemCount(); 
        firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); 


        if (loading) { 
        if (totalItemCount > previousTotal) { 
        loading = false; 
        previousTotal = totalItemCount; 
        } 
        } 

        if (!loading && (totalItemCount - visibleThreshold) <= (firstVisibleItem + visibleItemCount)) { 

         Log.v("scroll","Last Item Wow !"); 

         if(footerView.getVisibility()!=View.VISIBLE){ 
          footerView.setVisibility(View.VISIBLE); 
         } 

         refreshExpListViewData(); 
        } 
      } 

     } 
+0

private LinearLayoutManager mLayoutManager; \t private int previousTotal = 0; \t private boolean loading = true; \t private int visibleThreshold = 5; \t int firstVisibleItem, visibleItemCount, totalItemCount; –

Смежные вопросы