ListView загрузить больше внизу прокрутки

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

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
    {
        ////
    }


}

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

3 ответа

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

        }

Вместо использования 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 вашего адаптера, и он подойдет вам.

Очень простой способ реализовать "бесконечную прокрутку" - это использовать EndlessAdapter библиотека по обыкновению.

https://github.com/commonsguy/cwac-endless

Другие вопросы по тегам