【问题标题】:RecyclerView wants to add item on position out of listRecyclerView 想要在列表外的位置添加项目
【发布时间】:2016-03-02 22:37:09
【问题描述】:

我刚刚开始使用简短而甜蜜的Searchable RecyclerView,在我不得不使用addItem()之前它工作得很好。删除一个字母mModels 后,列表大小为237(参见图片上的count),但在添加项目时,它的大小为104,当它碰到想要位于第105 位的项目时,它神秘地抛出java.lang.OutOfBoundsException。从那些对象提供的字符串中,它只想成为目前列表中的最后一项。即使添加想要在列表末尾的项目,原始仓库也可以正常工作。我现在不知道该怎么办。

是的,过滤效果很好。它只是在我获取导致问题的查询字符时添加项目。

适配器代码:

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ExampleViewHolder> {

public class ExampleViewHolder extends RecyclerView.ViewHolder {

    private final TextView tvBeerName;

    public ExampleViewHolder(View itemView) {
        super(itemView);

        tvBeerName = (TextView) itemView.findViewById(R.id.row_title);
    }

    public void bind(PiwoSubclass model) {
        tvBeerName.setText(model.getBeerName());
    }
}

private final LayoutInflater mInflater;
private final List<PiwoSubclass> mModels;

public SearchAdapter(Context context, List<PiwoSubclass> models) {
    mInflater = LayoutInflater.from(context);
    mModels = new ArrayList<>(models);
}

@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    final View itemView = mInflater.inflate(R.layout.row_view_new, parent, false);
    return new ExampleViewHolder(itemView);
}

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
    final PiwoSubclass model = mModels.get(position);
    holder.bind(model);
}

@Override
public int getItemCount() {
    return mModels.size();
}

public void animateTo(List<PiwoSubclass> models) {
    applyAndAnimateRemovals(models);
    applyAndAnimateAdditions(models);
    applyAndAnimateMovedItems(models);
}

private void applyAndAnimateRemovals(List<PiwoSubclass> newModels) {
    for (int i = mModels.size() - 1; i >= 0; i--) {
        final PiwoSubclass model = mModels.get(i);
        if (!newModels.contains(model)) {
            removeItem(i);
        }
    }
}

private void applyAndAnimateAdditions(List<PiwoSubclass> newModels) {
    for (int i = 0, count = newModels.size(); i < count; i++) {
        final PiwoSubclass model = newModels.get(i);
        if (!mModels.contains(model)) {
            addItem(i, model);
        }
    }
}

private void applyAndAnimateMovedItems(List<PiwoSubclass> newModels) {
    for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
        final PiwoSubclass model = newModels.get(toPosition);
        final int fromPosition = mModels.indexOf(model);
        if (fromPosition >= 0 && fromPosition != toPosition) {
            moveItem(fromPosition, toPosition);
        }
    }
}

public PiwoSubclass removeItem(int position) {
    final PiwoSubclass model = mModels.remove(position);
    notifyItemRemoved(position);
    return model;
}

public void addItem(int position, PiwoSubclass model) {
    Log.d("Position-item", position + "");
    mModels.add(position, model);
    notifyItemInserted(position);
    //notifyDataSetChanged();
}

public void moveItem(int fromPosition, int toPosition) {
    final PiwoSubclass model = mModels.remove(fromPosition);
    mModels.add(toPosition, model);
    notifyItemMoved(fromPosition, toPosition);
}
}

片段摘录:

 @Override
    public boolean onQueryTextChange(String query) {
        final List<PiwoSubclass> filteredModelList = filter(mModels, query);
        mAdapter.animateTo(filteredModelList);
        Log.d("List-size", "Size: " + filteredModelList.size());
        mRecyclerView.scrollToPosition(0);
        return true;
    }

    private List<PiwoSubclass> filter(List<PiwoSubclass> models, String query) {
        query = query.toLowerCase();

        final List<PiwoSubclass> filteredModelList = new ArrayList<>();
        for (PiwoSubclass model : models) {
            final String beerName = model.getBeerName().toLowerCase();
            //final String breweryName = model.getBrewery().toLowerCase();
            if (beerName.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }

【问题讨论】:

  • 请分享一些适配器代码。
  • @vipulmittal 更新了我的问题
  • newModel怎么设置
  • @vipulmittal 我不需要。我将已过滤的列表传递给 animateTo() 方法。

标签: android arraylist android-recyclerview


【解决方案1】:

试试这个:

private void applyAndAnimateAdditions(List<PiwoSubclass> newModels) {

    for (int i = 0, count = newModels.size(); i < count; i++) {
        final PiwoSubclass model = newModels.get(i);
        if (!mModels.contains(model)) {
            addItem(0, model);

        }
    }
}

【讨论】:

  • 试试这个,“addItem(0, model);”。这将始终将项目添加到第 0 位。请告诉我结果
  • 奇怪的是我得到java.lang.IndexOutOfBoundsException: Invalid index 236, size is 232,当我认为它只是无序时,但知道我来自moveItem()方法
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2015-10-02
相关资源
最近更新 更多