java - 使用searchview android过滤recyclerview

标签 java android android-recyclerview searchview

我想在工具栏中实现 searchView 小部件来过滤 recyclerview。但我收到一条错误消息。

这是我的代码:

PasalAdapter.java

public class PasalAdapter extends RecyclerView.Adapter<ItemViewHolder> {

private List<PasalItem> mPasalItem;

public PasalAdapter(List<PasalItem> PasalItem) {
    mPasalItem = new ArrayList<>(PasalItem);
}

@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
    final PasalItem getPasal = mPasalItem.get(i);
    itemViewHolder.bind(getPasal);
}

@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false);
    return new ItemViewHolder(view);
}

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

/** Filter Logic**/
public void animateTo(List<PasalItem> models) {
    applyAndAnimateRemovals(models);
    applyAndAnimateAdditions(models);
    applyAndAnimateMovedItems(models);

}

private void applyAndAnimateRemovals(List<PasalItem> newModels) {


    for (int i = mPasalItem.size() - 1; i >= 0; i--) {
        final PasalItem model = mPasalItem.get(i);
        if (!newModels.contains(model)) {
            removeItem(i);
        }
    }
}

private void applyAndAnimateAdditions(List<PasalItem> newModels) {

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

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

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

public void addItem(int position, PasalItem model) {
    mPasalItem.add(position, model);
    notifyItemInserted(position);
}

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

}

ItemViewHolder.java

public class ItemViewHolder extends RecyclerView.ViewHolder {

private TextView pasal_TextView;
private TextView bab_TextView;

public ItemViewHolder(View itemView) {
    super(itemView);
    pasal_TextView = (TextView) itemView.findViewById(R.id.tx_pasal);
    bab_TextView = (TextView) itemView.findViewById(R.id.tx_bab);

}

public void bind(PasalItem pasalItem) {
    pasal_TextView.setText(pasalItem.getPasal());
    bab_TextView.setText(pasalItem.getBab());

}

}

PasalItem.Java

public class PasalItem {
private String pasal;
private String bab;

public String getPasal() {
    return pasal;
}


public void setPasal(String pasal) {
    this.pasal = pasal;
}


public String getBab() {
    return bab;
}

public void setBab(String bab) {
    this.bab = bab;
}

@Override
public String toString() {
    return this.pasal;

}

}

编辑

12-23 07:55:31.062 29266-29266/id.rsspdev.uud E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at id.rsspdev.uud.adapter.ItemViewHolder.bind(ItemViewHolder.java:26)
at id.rsspdev.uud.adapter.PasalAdapter.onBindViewHolder(PasalAdapter.java:28)
at id.rsspdev.uud.adapter.PasalAdapter.onBindViewHolder(PasalAdapter.java:17)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5250)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4487)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:761)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1670)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1528)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1441)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1670)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1528)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1441)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14099)
at android.view.ViewGroup.layout(ViewGroup.java:4464)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2183)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1947)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4879)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
at android.view.

有人能帮我吗?

最佳答案

您的 RecyclerView 中发生的情况与此处的此问题类似:

Getting position of View in onCreateViewHolder

其中 recyclerview 不维护静态位置索引。如果您不想在 recyclerview 执行此操作时丢失您的元素,则无法使用给定的位置。

尝试:

@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
     final PasalItem getPasal = mPasalItem.get(itemViewHolder.getAdapterPosition());
     itemViewHolder.bind(getPasal);
}

关于java - 使用searchview android过滤recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420748/

相关文章:

Java 将对象传递给方法

java - 从泛型类型获取枚举类?

java - java中如何获取类的字段名

android - Gradle 无法解析 Android Studio 中的依赖项

android - 刷新 RecyclerView 中的数据并保持其滚动位置

java - 当表单被 JavaScript 禁用时,JSF 表单不会被提交

android - GSON可以处理静态私有(private)嵌套类吗

android - 如何检查edittext的文本是否为电子邮件地址?

android - Horizo​​ntalScrollView与Recyclerview滑动android冲突

android - java.lang.IllegalStateException : Cannot call this method while RecyclerView is computing a layout or scrolling 错误