2016-03-02 57 views
0

我刚开始使用短而甜的Searchable RecyclerView,它工作正常,直到我必须使用addItem()。删除一个字母mModels列表大小为237(见图片上的count),但是在添加项目时它的大小是104,并且当它命中想要在第105个位置的项目时它神奇地投掷java.lang.OutOfBoundsException。这些对象提供的字符串只是想成为目前列表中的最后一项。即使在添加想要列表结尾的项目时,原始回购也能正常工作。我现在不知道该怎么做。RecyclerView想把项目放在列表中的位置

是的,过滤工作很好。这只是添加项目,当我把查询的字符引起问题。

enter image description here

适配器代码:

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; 
    } 
+0

活动分享一些代码的适配器。 –

+0

@vipulmittal更新了我的问题 –

+0

如何设置新模型 –

回答

-3

您正在使用 '最终名单mModels;'。最终变量在被初始化后不允许被修改。删除最后的修饰符,它应该工作。

+0

他们没有在任何地方修改'mModels'。他们调用的方法不受变量是否是最终的影响。 –

0

试试这个:

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); 

     } 
    } 
} 
+0

还是一样的错误 –

+0

试试这个,“addItem(0,model);”。这将始终将项目添加到第0个位置。请让我知道结果 – Sabari

+0

它正在工作.... – Sabari

相关问题