android - 在 recyclerView 的行内处理按钮单击

标签 android database onclick android-recyclerview adapter

我想知道如果适配器发生变化如何处理行的位置 - 例如,如果我向 SearchView 写入一些内容 - 适配器已更改并且位置不同。我已经这样做了(如下),但它显示了更改位置之前的项目。

我的问题与 Recycler 查看项目点击有关。

你能帮我吗?

适配器

public class ContactsRecyclerAdapter extends RecyclerView.Adapter<ContactsRecyclerAdapter.BindingHolder> {

    private static OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(View itemView, int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    private List<Contact> mContacts;
    private List<Contact> mContactsFiltered;
    SearchViewFilter filter;
    Context mContext;

    public ContactsRecyclerAdapter(Context context, List<Contact> contact) {
        this.mContext = context;
        this.mContacts = contact;
        this.mContactsFiltered = contact;
        filter = new SearchViewFilter(mContacts, this);
    }

    public static class BindingHolder extends RecyclerView.ViewHolder {
        private ViewDataBinding binding;

        public BindingHolder(final View rowView) {
            super(rowView);
            binding = DataBindingUtil.bind(rowView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null)
                        listener.onItemClick(itemView, getLayoutPosition());
                }
            });
        }
        public ViewDataBinding getBinding() {
            return binding;
        }
    }

    @Override
    public BindingHolder onCreateViewHolder(ViewGroup parent, int type) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
        BindingHolder holder = new BindingHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {
        final Contact contact = mContactsFiltered.get(position);
        holder.getBinding().setVariable(BR.contact, contact);
        holder.getBinding().executePendingBindings();
    }

fragment

   public class ContactListFragment extends Fragment implements View.OnClickListener {

        FloatingActionButton fabButton;
        SearchView searchView;
        RecyclerView recyclerView;
        String name, number, email;

        private List<Contact> mContact = new ArrayList<>();
        private ContactsRecyclerAdapter mAdapter;

        public static ContactListFragment newInstance() {
            Bundle args = new Bundle();
            ContactListFragment fragment = new ContactListFragment();
            fragment.setArguments(args);
            return fragment;
        }

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setHasOptionsMenu(true);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_contact_list, container, false);

            searchView = (SearchView) view.findViewById(R.id.search_view);

            recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
            mContact = SugarRecord.listAll(Contact.class);

            mAdapter = new ContactsRecyclerAdapter(getActivity(), mContact);
            recyclerView.setAdapter(mAdapter);

            //item click
            mAdapter.setOnItemClickListener(new ContactsRecyclerAdapter.OnItemClickListener() {

                @Override
                public void onItemClick(View itemView, int position) {
                    Contact contact = SugarRecord.findById(Contact.class, (long) position + 1);

                    name = contact.getName();
                    number = contact.getNumber();
                    email = contact.getEmail();
                    showAlertDialog();
                }
            });

            searchFilter();

            return view;
        }

public void sortList() {
        if(mContact.size() > 0) {
            if (!isSort) {
                Collections.sort(mContact, new Comparator<Contact>() {
                    @Override
                    public int compare(Contact contact1, Contact contact2) {
                        return contact1.getName().compareToIgnoreCase(contact2.getName());
                    }
                });
            }
            else {
                Collections.reverse(mContact);
                isSort = false;
            }
        }
        mAdapter.notifyDataSetChanged();

最佳答案

点击监听器不适用于 RecyclerView。使用 OnItemTouchListener()

RecyclerView recyclerView = findViewById(R.id.recycler);
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
      @Override public void onItemClick(View view, int position) {
        // do whatever
      }

      @Override public void onLongItemClick(View view, int position) {
        // do whatever
      }
   })
);

关于android - 在 recyclerView 的行内处理按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38527317/

相关文章:

javascript - 对于向上和向下箭头键的多个 ng-repeats,如何激活类等于 true?

php - 我无法使用 PHP 将很长的文本上传到 MySQL

mysql - 选择具有最大 id 值的表行

javascript - 当我在 JavaScript 上单击 next 和 previous 时如何设置数组的顺序?

java - 在以上 Android N 的对话框中,Edittext 无法接收来自键盘的输入

android - 具有键值对的微调器

android - 持有相同图像的多个 ImageView 是否会创建额外的 Drawable 对象或 Drawable 实例?

sql - Access SQL 查询以在 2 个表中搜索值但只使用一个?

android - 在撰写中 onClick 后禁用查看

javascript - 在javascript中让按钮显示文本