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