Android “处理”按钮单击recyclerView中的行内
我想知道如果适配器更改了,如何处理行的位置—例如,如果我向SearchView写入了内容—适配器已更改,并且位置不同。我已经这样做了(如下),但它显示了改变位置之前的项目 我的问题是回收者查看项目点击 你能帮我吗 适配器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
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;
}
}