i use setOnScrollListener that show other element.
lvMain.setOnScrollListener(new OnScrollListener()
{
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if(firstVisibleItem + visibleItemCount >= totalItemCount) {
boxAdapter.count += visibleItemCount;
boxAdapter.notifyDataSetChanged();
}
else
{}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
});
By default, the list gets only 10 elements.
@Override
public int getCount() {
//return objects.size();
return 10;
}
Everything is loaded when I scroll, but when I reach the end of the application is closed. What is the reason?
LogCat:
03-28 18:27:22.243: E/AndroidRuntime(31068): FATAL EXCEPTION: main
03-28 18:27:22.243: E/AndroidRuntime(31068): Process: com.example.warapp, PID: 31068
03-28 18:27:22.243: E/AndroidRuntime(31068): java.lang.IndexOutOfBoundsException: Invalid index 100, size is 100
03-28 18:27:22.243: E/AndroidRuntime(31068): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
03-28 18:27:22.243: E/AndroidRuntime(31068): at java.util.ArrayList.get(ArrayList.java:308)
03-28 18:27:22.243: E/AndroidRuntime(31068): at com.example.warapp.BoxAdapter.getItem(BoxAdapter.java:49)
03-28 18:27:22.243: E/AndroidRuntime(31068): at com.example.warapp.BoxAdapter.getView(BoxAdapter.java:67)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.AbsListView.obtainView(AbsListView.java:2240)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.ListView.makeAndAddView(ListView.java:1790)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.ListView.fillDown(ListView.java:691)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.ListView.fillGap(ListView.java:655)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5136)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4247)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.view.Choreographer.doFrame(Choreographer.java:543)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.os.Handler.handleCallback(Handler.java:733)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.os.Handler.dispatchMessage(Handler.java:95)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.os.Looper.loop(Looper.java:136)
03-28 18:27:22.243: E/AndroidRuntime(31068): at android.app.ActivityThread.main(ActivityThread.java:5017)
03-28 18:27:22.243: E/AndroidRuntime(31068): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 18:27:22.243: E/AndroidRuntime(31068): at java.lang.reflect.Method.invoke(Method.java:515)
03-28 18:27:22.243: E/AndroidRuntime(31068): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-28 18:27:22.243: E/AndroidRuntime(31068): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-28 18:27:22.243: E/AndroidRuntime(31068): at dalvik.system.NativeStart.main(Native Method)
BaseAdapter:
public class BoxAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<ItemInfo> objects;
String name;
int count = 10;
BoxAdapter(Context context, ArrayList<ItemInfo> products) {
ctx = context;
objects = products;
lInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
// кол-во элементов
@Override
public int getCount() {
//return objects.size();
return count;
}
// элемент по позиции
@Override
public ItemInfo getItem(int position) {
return objects.get(position);
}
// id по позиции
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
ItemInfo p = getItem(position);
if (p.username.contains("null"))
{
name = "Автор: Неизвестен";
}
else
{
name = "Автор: " + p.username;
}
((TextView) view.findViewById(R.id.name)).setText(name);
return view;
}
}
I improved your adapter and added a loadAdditionalItems()
method. So when you reach the bottom of your list view just call this:
adapter.loadAdditionalItems();
Here is the adapter:
public class BoxAdapter extends BaseAdapter {
private final Context context;
private final LayoutInflater inflater;
private final ArrayList<ItemInfo> itemInfos;
private final int loadCount = 10;
private int count = 10;
private String name;
BoxAdapter(Context context, ArrayList<ItemInfo> products) {
this.context = context;
this.itemInfos = products;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return this.count;
}
@Override
public ItemInfo getItem(int position) {
return itemInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void loadAdditionalItems() {
this.count += this.loadCount;
if (this.count > this.itemInfos.size()) {
this.count = this.itemInfos.size();
}
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.item, parent, false);
}
// You should implement the ViewHolder pattern, google for it.
ItemInfo p = getItem(position);
if (p.username.contains("null")) {
name = "Автор: Неизвестен";
} else {
name = "Автор: " + p.username;
}
((TextView) view.findViewById(R.id.name)).setText(name);
return view;
}
}