Java Android-在ListView中显示更多元素

Java Android-在ListView中显示更多元素,java,android,listview,onscroll,Java,Android,Listview,Onscroll,我使用setOnScrollListener来显示其他元素 lvMain.setOnScrollListener(new OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

我使用setOnScrollListener来显示其他元素

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
            }

        });
默认情况下,列表仅获取10个元素

  @Override
  public int getCount() {
    //return objects.size();
      return 10;
  }
当我滚动时,所有内容都已加载,但当我到达应用程序的末尾时,应用程序将关闭。原因是什么

日志:

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)
基本适配器:

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;
      }

    }
公共类BoxAdapter扩展了BaseAdapter{
上下文ctx;
拉平机;
阵列列表对象;
字符串名;
整数计数=10;
BoxAdapter(上下文、ArrayList产品){
ctx=上下文;
对象=产品;
lInflater=(LayoutInflater)ctx
.getSystemService(上下文布局\充气机\服务);
}
// кол-во элементов
@凌驾
public int getCount(){
//返回objects.size();
返回计数;
}
// элемент по позиции
@凌驾
public ItemInfo getItem(int位置){
返回对象。获取(位置);
}
//身份证
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
视图=lInflater.充气(R.layout.item,父项,false);
}
ItemInfo p=getItem(位置);
如果(p.username.contains(“null”))
{
name=“Аццззцц”;
}
其他的
{
name=“Ацц”:+p.username;
}
((TextView)view.findviewbyd(R.id.name)).setText(name);
返回视图;
}
}

我改进了适配器,并添加了一个
loadAdditionalItems()
方法。因此,当您到达列表视图的底部时,只需调用以下命令:

adapter.loadAdditionalItems();
下面是适配器:

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;
    }

}
公共类BoxAdapter扩展了BaseAdapter{
私人最终语境;
私人充气机;
私人最终ArrayList itemInfos;
私有最终整数装载计数=10;
私有整数计数=10;
私有字符串名称;
BoxAdapter(上下文、ArrayList产品){
this.context=上下文;
this.itemInfos=产品;
this.inflater=layoutiner.from(上下文);
}
@凌驾
public int getCount(){
返回这个.count;
}
@凌驾
public ItemInfo getItem(int位置){
返回itemInfos.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共void loadAdditionalItems(){
this.count+=this.loadCount;
如果(this.count>this.itemInfos.size()){
this.count=this.itemInfos.size();
}
notifyDataSetChanged();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
视图=充气机。充气(R.layout.item,父项,false);
}
//你应该实现ViewHolder模式,谷歌就可以了。
ItemInfo p=getItem(位置);
如果(p.username.contains(“null”)){
name=“Аццззцц”;
}否则{
name=“Ацц”:+p.username;
}
((TextView)view.findviewbyd(R.id.name)).setText(name);
返回视图;
}
}
有一个名为的库,你可以使用它来实现你想要做的事情


是关于如何在应用程序中使用它的教程

我有100个元素,我想显示10,当用户到达终点时,我想再获得10个元素,以此类推,直到100我怀疑你想做类似的事情。你已经试过我的建议了吗?它起作用了吗?如果没有,请发布更多代码。特别是从你的适配器。我用对了吗?