3

Я хочу реализовать OnScrollListener, чтобы загрузить больше данных при прокрутке вниз, динамически. Следующий код дает мне NullPointerException, но когда я объявляюAndroid бесконечный вид списка прокрутки

BusinessListDataAdapter adapter = new BusinessListDataAdapter(this, 
      this.imgFetcher, this.layoutInflator, this.businesses); 

внутри setBusiness, он не показывает ошибку и работает отлично. Проблема с этим, когда я прокручиваю в нижней части страницы заменяет текущие данные в list view с новыми данными, но то, что я хотел это бесконечный скроллинг в то время как добавление новых данных вместо замены, так что я могу просмотреть первые данные прокрутки вверх

import java.util.ArrayList; 

import com.sp.sodhpuch.adapters.BusinessListDataAdapter; 
import com.sp.sodhpuch.data.BusinessListData; 
import com.sp.sodhpuch.tasks.BusinessListApiTask; 
import com.sp.sodhpuch.tasks.BusinessListIconTask; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ListResultActivity extends Activity { 

    private ArrayList<BusinessListData> businesses; 
    private ListView businessList; 
    private LayoutInflater layoutInflator; 
    private BusinessListIconTask imgFetcher; 
    BusinessListDataAdapter adapter = new BusinessListDataAdapter(this, 
      this.imgFetcher, this.layoutInflator, this.businesses); 

    @SuppressWarnings("unchecked") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.businesslist); 
     getData(); 
//  @SuppressWarnings("deprecation") 
//  final Object[] data = (Object[]) getLastNonConfigurationInstance(); 
//  if (data != null) { 
//   setContentView(R.layout.businesslist); 
//   this.businessList = (ListView) findViewById(R.id.lvBusinesslist); 
//   this.imgFetcher = new BusinessListIconTask(this); 
//   this.layoutInflator = LayoutInflater.from(this); 
// 
//   this.businesses = (ArrayList<BusinessListData>) data[0]; 
//   this.imgFetcher = (BusinessListIconTask) data[1]; 
//   businessList.setAdapter(adapter); 
//  } 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     Object[] myStuff = new Object[2]; 
     myStuff[0] = this.businesses; 
     myStuff[1] = this.imgFetcher; 
     return myStuff; 
    } 

    /** 
    * Bundle to hold refs to row items views. 
    * 
    */ 
    public static class MyViewHolder { 
     public TextView businessName, businessAddress, phoneNo; 
     public Button btnProfile; 
     public ImageView icon; 
     public BusinessListData business; 
    } 

    public void setBusinesses(ArrayList<BusinessListData> businesses) { 
     this.businessList = (ListView) findViewById(R.id.lvBusinesslist); 

     this.imgFetcher = new BusinessListIconTask(this); 
     this.layoutInflator = LayoutInflater.from(this); 
     this.businesses = businesses; 
     this.businessList.setAdapter(adapter); 
     businessList.setOnScrollListener(new OnScrollListener() { 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       if (businessList.getLastVisiblePosition() == totalItemCount - 1) { 
        getData(); 
//     adapter.notifyDataSetChanged(); 
       } 

      } 
     }); 

    } 

    private void getData() { 
     // TODO Auto-generated method stub 
     Intent myIntent = getIntent(); 

     // gets the arguments from previously created intent 
     String metroTxt = myIntent.getStringExtra("key"); 
     String metroLoc = myIntent.getStringExtra("loc"); 
     String metroId = myIntent.getStringExtra("qt"); 

     BusinessListApiTask spTask = new BusinessListApiTask(
       ListResultActivity.this); 

     try { 
      spTask.execute(metroTxt, metroLoc, metroId); 

     } catch (Exception e) { 
      spTask.cancel(true); 
     } 
    } 

} 

Вот LogCat

10-17 04:50:51.897: W/dalvikvm(6942): threadid=1: thread exiting with uncaught exception (group=0xb1d41b20) 
10-17 04:50:51.897: E/AndroidRuntime(6942): FATAL EXCEPTION: main 
10-17 04:50:51.897: E/AndroidRuntime(6942): Process: com.sp.sodhpuch, PID: 6942 
10-17 04:50:51.897: E/AndroidRuntime(6942): java.lang.NullPointerException 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.sp.sodhpuch.adapters.BusinessListDataAdapter.getCount(BusinessListDataAdapter.java:53) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.widget.ListView.setAdapter(ListView.java:480) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.sp.sodhpuch.ListResultActivity.setBusinesses(ListResultActivity.java:78) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.sp.sodhpuch.tasks.BusinessListApiTask.onPostExecute(BusinessListApiTask.java:119) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.sp.sodhpuch.tasks.BusinessListApiTask.onPostExecute(BusinessListApiTask.java:1) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.os.AsyncTask.finish(AsyncTask.java:632) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.os.Looper.loop(Looper.java:136) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
10-17 04:50:51.897: E/AndroidRuntime(6942):  at dalvik.system.NativeStart.main(Native Method) 
+0

Возможный дубликат [Android - ListView для загрузки большего количества товаров, когда достигнут конца] (http://stackoverflow.com/questions/20458475/android-listview-to-load-more-items-when-reached-end) – SelvaMariappan

+0

post logcat please –

+0

Я подключил logcat – carefree

ответ

0

Вам нужно сделать три вещи.

1) Создайте метод, который добавит еще десять элементов в список адаптеров.

2) Добавьте xml, содержащий кнопку в нижнем колонтитуле listview.

3) Затем напишите clickListener для этой кнопки в классе активности или фрагмента, в котором вы вызываете метод шага 1, а затем просто перезагружаете адаптер listview.

0

От Android - ListView to load more items when reached end

Вы можете добавить колонтитула на ListView, который будет иметь кнопку с именем LoadMore. Вот полный учебник List With Load more Или вы можете реализовать onscrolllistener() и добавить этот слушатель в ListView

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    this.currentFirstVisibleItem = firstVisibleItem; 
    this.currentVisibleItemCount = visibleItemCount; 
} 

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    this.currentScrollState = scrollState; 
    this.isScrollCompleted(); 
} 

private void isScrollCompleted() { 
    if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) { 
     /*** In this way I detect if there's been a scroll which has completed ***/ 
     /*** do the work for load more date! ***/ 
     if(!isLoading){ 
     isLoading = true; 
     loadMoreData(); 
    } 
} 
} 
+0

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

0

Привет @carefree вот решение, которое могли бы получить именно то, что вы хотите достичь https://github.com/rahulinaction/ImageGrid

+1

, вы можете получить ссылку от https://github.com/androidcodes/Surviving-with-android –

0

Проблема, скорее всего, будет связана с вашей задачей и адаптером не с прокруткой списка. Вы можете реализовать метод, AddItems, в вашем listAdapter следующим образом:

public void addItems(BusniessListData... newItems){ 
     for(BusniessListData newItem : newItems){ 
      this.businesses.add(newItem); 
     }   
     notifyDataSetChanged(); 
    } 

В onPostExecute вашей задачи, или независимо от обратного вызова вы используете, проверьте listAdapter есть элементы, а затем вызвать AddItems передавая его вновь неправдоподобные вещи. В противном случае инициируйте и заполняйте набор данных.

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