Android “处理”按钮单击recyclerView中的行内

Android “处理”按钮单击recyclerView中的行内,android,database,onclick,android-recyclerview,adapter,Android,Database,Onclick,Android Recyclerview,Adapter,我想知道如果适配器更改了,如何处理行的位置—例如,如果我向SearchView写入了内容—适配器已更改,并且位置不同。我已经这样做了(如下),但它显示了改变位置之前的项目 我的问题是回收者查看项目点击 你能帮我吗 适配器 public class ContactsRecyclerAdapter extends RecyclerView.Adapter<ContactsRecyclerAdapter.BindingHolder> { private static OnItem

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

我的问题是回收者查看项目点击

你能帮我吗

适配器

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();
    }
公共类联系人RecyclerAdapter扩展了RecyclerView.Adapter{
私有静态侦听器;
公共接口侦听器{
void onItemClick(视图项视图,int位置);
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
this.listener=listener;
}
私人名单;
私有列表MContacts已过滤;
搜索视图过滤器;
语境;
公共联系人RecyclerAdapter(上下文、列表联系人){
this.mContext=上下文;
this.mContacts=触点;
this.mContactsFiltered=触点;
过滤器=新的SearchViewFilter(mContacts,this);
}
公共静态类BindingHolder扩展了RecyclerView.ViewHolder{
私有视图数据绑定;
公共绑定持有者(最终视图行视图){
超级(rowView);
binding=DataBindingUtil.bind(行视图);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(侦听器!=null)
onItemClick(itemView,getLayoutPosition());
}
});
}
公共视图数据绑定getBinding(){
返回绑定;
}
}
@凌驾
public BindingHolder onCreateViewHolder(视图组父级,int类型){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u item\u contact,parent,false);
BindingHolder=新的BindingHolder(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(BindingHolder,int位置){
最终触点=mContactsFiltered.get(位置);
holder.getBinding().setVariable(BR.contact,contact);
holder.getBinding().executePendingBindings();
}
碎片

   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();
公共类ContactListFragment扩展片段实现View.OnClickListener{
浮动操作按钮;
搜索视图搜索视图;
回收视图回收视图;
字符串名称、编号、电子邮件;
private List mContact=new ArrayList();
私人联系人RecyclerAdapter mAdapter;
公共静态ContactListFragment newInstance(){
Bundle args=新Bundle();
ContactListFragment=新ContactListFragment();
fragment.setArguments(args);
返回片段;
}
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建视图上的公共视图(布局、充气机、最终视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u contact\u list,container,false);
searchView=(searchView)view.findviewbyd(R.id.search\u视图);
recyclerView=(recyclerView)视图.findViewById(R.id.recycler\u视图);
setLayoutManager(新的LinearLayoutManager(getContext());
mContact=SugarRecord.listAll(Contact.class);
mAdapter=新联系人RecyclerAdapter(getActivity(),mContact);
recyclerView.setAdapter(mAdapter);
//项目点击
setOnItemClickListener(新联系人RecyclerAdapter.OnItemClickListener(){
@凌驾
public void onItemClick(视图项视图,int位置){
联系人=SugarRecord.findById(Contact.class,(long)位置+1);
name=contact.getName();
number=contact.getNumber();
email=contact.getEmail();
showAlertDialog();
}
});
searchFilter();
返回视图;
}
公共无效分类列表(){
如果(mContact.size()>0){
如果(!isSort){
Collections.sort(mContact,newcomparator(){
@凌驾
公共int比较(联系人1、联系人2){
返回contact1.getName().compareToIgnoreCase(contact2.getName());
}
});
}
否则{
收款。反向(mContact);
isSort=假;
}
}
mAdapter.notifyDataSetChanged();

单击侦听器无法与RecyclerView一起使用。请使用OnItemTouchListener()


您必须覆盖BindingHolder类中的onclick。在onclick方法内部调用通过构造函数传递的对象的回调方法等

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

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

        public void onClick(View view) {
        //call a callback method here
        }
    }
    public ViewDataBinding getBinding() {
        return binding;
    }
}

这和我一样。但我的重点是如何检查位置是否不同。例如,我有一些名字-1.Tom,2.Adele,3.Beta,然后我将它们排序为A-Z(因此它们是“混合的”)。所以第一个是Adele,然后是Beta和Tom。但如果我单击2.item,它会显示我Adele(因此位置相同),但我想显示Beta。如果您在方法中传递位置,请使用该位置从适配器正在处理的列表中获取值。i.r yourList.get(位置)将为您获取该位置的项,因为列表将被排序,位置2将被Beta占用,您将在yourList.get(位置)中获取该值好的,但我忘了说我是从数据库中获取数据的,所以数据库位置?将您获取的数据保存在一个列表中并进行排序。然后使用位置。它实际上与从数据库获取位置相同。请您更具体一点好吗?我是
public static class BindingHolder extends RecyclerView.ViewHolder {
    private ViewDataBinding binding;

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

        public void onClick(View view) {
        //call a callback method here
        }
    }
    public ViewDataBinding getBinding() {
        return binding;
    }
}