RecyclerView onClick在过滤器适配器上的geting错误

时间:2015-12-25 13:02:39

标签: android onclick android-recyclerview android-adapter recycler-adapter

我有可过滤且可点击的RecyclerView。但是当我过滤这个适配器时我感到很恐怖

过滤前:

Before Filter

过滤后:

仍在第3位显示项目

After Filter

我的适配器:

public class PasalBabAdapter extends RecyclerView.Adapter<PasalBabVH> {

    private List<PasalBabModel> mPasalBabModel;
    private MyItemClickListener mItemClickListener;
    private MyItemLongClickListener mItemLongClickListener;

    public PasalBabAdapter(List<PasalBabModel> mPasalBabModel) {
        this.mPasalBabModel = mPasalBabModel;
    }

    @Override
    public void onBindViewHolder(PasalBabVH holder, int position) {
        PasalBabModel bean = mPasalBabModel.get(position);
        holder.p_TextView.setText(bean.pasalbab_p);
        holder.b_TextView.setText(bean.pasalbab_b);
    }

    public PasalBabVH onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.pasalbab_row, parent, false);
        PasalBabVH vh = new PasalBabVH(itemView, mItemClickListener, mItemLongClickListener);
        return vh;
    }


    public void setFilter(List<PasalBabModel> PasalBabModels) {
        mPasalBabModel = new ArrayList<>();
        mPasalBabModel.addAll(PasalBabModels);
        notifyDataSetChanged();
    }

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

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

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

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

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

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

    public void addItem(int position, PasalBabModel model) {
        mPasalBabModel.add(position, model);
        notifyItemInserted(position);
    }

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

    /**
     * ÉèÖÃItemµã»÷¼àÌý
     * @param listener
     */

    public void setOnItemClickListener(MyItemClickListener listener) {
        this.mItemClickListener = listener;
    }

    public void setOnItemLongClickListener(MyItemLongClickListener listener) {
        this.mItemLongClickListener = listener;
    }

}

我的片段:

public class Pasal_Bab extends Fragment implements SearchView.OnQueryTextListener {

    private RecyclerViewEmptySupport rv;
    private CoordinatorLayout mRelativeLayout;
    private List<PasalBabModel> mPBH;
    private PasalBabAdapter adapter;
    private FloatingActionButton fab;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.activity_pasal, container, false);
        mRelativeLayout = (CoordinatorLayout) view.findViewById(R.id
                .coordinator);

        rv = (RecyclerViewEmptySupport) view.findViewById(R.id.rv_pasal);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(layoutManager);
        rv.setEmptyView(view.findViewById(R.id.empty));
        rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setHasOptionsMenu(true);

        String[] locales = Locale.getISOCountries();
        mPBH = new ArrayList<>();

        for (String countryCode : locales) {
            Locale obj = new Locale("Pasalxyz", countryCode);
            mPBH.add(new PasalBabModel(obj.getDisplayCountry(), obj.getISO3Country()));
        }

        adapter = new PasalBabAdapter(mPBH);
        rv.setAdapter(adapter);
        adapter.setOnItemClickListener(new MyItemClickListener() {
            @Override
            public void onItemClick(View view, int postion) {
                PasalBabModel bean = mPBH.get(postion);
                if (bean != null) {
                    Toast.makeText(getActivity(), bean.getpasalbab_p(), Toast.LENGTH_SHORT).show();
                }
            }
        });
        adapter.setOnItemLongClickListener(new MyItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, int postion) {
                PasalBabModel bean = mPBH.get(postion);
                if (bean != null) {
                    Toast.makeText(getActivity(), bean.getpasalbab_p() + " Termasuk dalam " + bean.getpasalbab_b(), Toast.LENGTH_SHORT).show();

                }
            }
        });
    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);

        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                        // Do something when collapsed
                        adapter.setFilter(mPBH);
                        return true; // Return true to collapse action view
                    }

                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        // Do something when expanded
                        return true; // Return true to expand action view
                    }
                });
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        final List<PasalBabModel> filteredModelList = filter(mPBH, newText);
        adapter.setFilter(filteredModelList);
        return false;
    }

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

        final List<PasalBabModel> filteredModelList = new ArrayList<>();
        for (PasalBabModel model : models) {
            final String text = model.getpasalbab_p().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }
}

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:5)

您正在点击旧项目,因为您正在使用初始列表来获取当前项目。在PasalBabAdapter班级中创建方法:

public PasalBabModel getItem(int position) {
    return mPasalBabModel.get(position);
}

并在点击监听器中使用它:

adapter.setOnItemClickListener(new MyItemClickListener() {
        @Override
        public void onItemClick(View view, int postion) {
            PasalBabModel bean = adapter.getItem(postion);
            // use your bean object
        }
    });