Android ArrayAdapter динамически добавляет больше данных при прокрутке

Я хочу добавить некоторые данные во время прокрутки всякий раз, когда прокрутка достигает 5 позиции, но получаю ошибку ArrayOutOfBoundException...

// Установить адаптер в MainActivity

  Context context = this;
  ArrayList<String> data = new  ArrayList<String> ; 
     for(int i =0; i <20;i++){
            data.add("a");
      }
  CustomAdapter customAdapter = new CustomAdapter(
                    context,   data);
  autoComplete.setAdapter(customAdapter);

// Пользовательский адаптер

public class customAdapter extends ArrayAdapter<String>   {

    private Context context;
    private LayoutInflater layoutInflater;
    private LogsViewHolder logViewHolder;
     ArrayList<String> data = null; 

    public customAdapter(Context context, ArrayList<String> data) {
        super(context, 0, data);
        this.context = context;
        this.data = data;
        layoutInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int itemCount = data.size() - position;

        if (getCount()>position &&  itemCount== 5) {
            data.add("bbbbbbbbbbbbbb");
            data.add("bbbbbbb ");
            data.add("b bb");
            data.add("bbb bbbb");
            data.add("bb bbbbbb");
            data.add("b bbb");

            CustomAdapter customAdapter = (CustomSearchAdapter)  autoComplete.getAdapter();
            customAdapter.notifyDataSetChanged();
        }
        if (convertView == null) {
            logViewHolder = new LogsViewHolder();
            convertView = layoutInflater.inflate(R.layout.list_row, null);

            logViewHolder.data = (TextView) convertView
                    .findViewById(R.id.data);


            convertView.setTag(logViewHolder);

        } else
            logViewHolder = (LogsViewHolder) convertView.getTag();


        logViewHolder.data.setText(data.get(position));

        return convertView;
    }

    public class LogsViewHolder {
        public TextView data;
    }


    @Override
    public int getCount() {

        return data.size();
    }


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

Пожалуйста, скажите мне решение, как удалить эту ошибку и почему эта ошибка приходит...

2 ответа

Решение

Один раз попробуйте следующим образом Изменить следующую строку

if (getCount()>position &&  itemCount== 5) {

в

if (position==4) {

Примечание. Если прокрутка достигает позиции 5, то в getView() позиция равна 4, потому что индекс начинается с 0.

Если вы хотите добавить больше элементов в конце списка, вы можете сделать следующее

if (position==itemCount-1) {

Надеюсь, это поможет вам.

Я думаю, вы должны попробовать добавить OnScrollListener на ваш ListView вместо добавления в getView в вашем Adapter:

public void onScroll (AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount){
    // check position here.
}

Если вы хотите создать EndlessAdapter, посмотрите на предыдущую ссылку:

@Override
protected void appendCachedData() {
if (getWrappedAdapter().getCount()<75) {
  @SuppressWarnings("unchecked")
  // Append your adapter here.
}
}
Другие вопросы по тегам