我刚开始使用短而甜的Searchable RecyclerView,它工作正常,直到我必须使用addItem()
。删除一个字母mModels
列表大小为237(见图片上的count
),但是在添加项目时它的大小是104,并且当它命中想要在第105个位置的项目时它神奇地投掷java.lang.OutOfBoundsException
。这些对象提供的字符串只是想成为目前列表中的最后一项。即使在添加想要列表结尾的项目时,原始回购也能正常工作。我现在不知道该怎么做。RecyclerView想把项目放在列表中的位置
是的,过滤工作很好。这只是添加项目,当我把查询的字符引起问题。
适配器代码:
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更新了我的问题 –
如何设置新模型 –