【发布时间】: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