Android RecyclerView搜索筛选器位置错误

Android RecyclerView搜索筛选器位置错误,android,Android,我使用RecyclerView,并在其上制作了过滤器,但我遇到了问题 在我搜索后,当我按下项目时,我得到了错误的位置,而不是一个我搜索过的位置,请帮助我解决这个问题 回收视图适配器 公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{ 语境; 列出getDataAdapter; 公共RecycleServiceAdapter(列表getDataAdapter,上下文){ 超级(); this.getDataAdapter=getDataAdapter;

我使用RecyclerView,并在其上制作了过滤器,但我遇到了问题

在我搜索后,当我按下项目时,我得到了错误的位置,而不是一个我搜索过的位置,请帮助我解决这个问题

回收视图适配器
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{
语境;
列出getDataAdapter;
公共RecycleServiceAdapter(列表getDataAdapter,上下文){
超级();
this.getDataAdapter=getDataAdapter;
this.context=上下文;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.cardview\u布局,parent,false);
ViewHolder ViewHolder=新的ViewHolder(v,context,getDataAdapter);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
listitem_gib getDataAdapter1=getDataAdapter.get(位置);
holder.name.setText(getDataAdapter1.getName());
holder.num.setText(getDataAdapter1.getnum());
毕加索.with(context).load(“http://i-geeky.info/android/image/“+getDataAdapter1.getimg()).into(holder.img1);
}
@凌驾
public int getItemCount(){
返回getDataAdapter.size();
}
类ViewHolder扩展了RecyclerView.ViewHolder
实现View.OnClickListener{
公共文本视图名称;
公共文本视图num;
公共图像视图img1;
图像按钮fav;
语境;
列出getDataAdapter;
公共视图持有者(视图项视图、上下文上下文、列表getDataAdapter){
超级(项目视图);
setOnClickListener(这个);
this.getDataAdapter=getDataAdapter;
this.context=上下文;
this.fav=(ImageButton)itemView.findViewById(R.id.btn_fav);
name=(TextView)itemView.findViewById(R.id.Main\u Text);
num=(TextView)itemView.findViewById(R.id.Second\u Text);
img1=(ImageView)itemView.findViewById(R.id.img1);
}
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
listitem_gib getDataAdapter=this.getDataAdapter.get(位置);
意向意向=新意向(this.context,Rewaya_info.class);
intent.putExtra(“name”,getDataAdapter.getName());
intent.putExtra(“url”,getDataAdapter.geturl());
intent.putExtra(“img”,getDataAdapter.getimg());
intent.putExtra(“num”,getDataAdapter.getnum());
intent.putExtra(“size”,getDataAdapter.getsize());
这个。上下文。起始触觉(意图);
}
}
公共void setFilter(列表newList)
{
getDataAdapter=newArrayList();
getDataAdapter.addAll(newList);
notifyDataSetChanged();
}}
活动
@覆盖
公共布尔onQueryTextChange(字符串newText){
newText=newText.toLowerCase();
List newList=newarraylist();
对于(listitem_gib列表:GetDataAdapter1){
字符串名称=list.getName().toLowerCase();
字符串名称1=list.getnum().toLowerCase();
if(name.contains(newText)| | name1.contains(newText)){
newList.add(list);
}
}
RecycleServiceAdapter.setFilter(新列表);
返回true;
}

recyclerview重新使用现有元素,并将新数据简单地绑定到这些元素——这可以防止需要创建和销毁的项目,而不是回收它们;)

查看
视图持有者的构造函数。在它中,您传递视图持有者绑定到的初始数据列表。实际上,这将创建一个到初始列表的静态绑定,而不是筛选列表

public ViewHolder(View itemView, Context context ,List<listitem_gib> getDataAdapter ) {
    super(itemView);
    itemView.setOnClickListener(this);
    this.getDataAdapter = getDataAdapter; <-- this is stored in the viewholder
    ...
}
更新您的
ViewHolder
,如下所示:

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) {

    listitem_gib item =  getDataAdapter.get(position);
    holder.bind(item);
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private TextView name;
    private TextView num;
    private ImageView img1;

    ImageButton fav;

    Context context;
    private listitem_gib currentItem; //<-- allows this viewholder to keep a reference to the bound item

    public ViewHolder(View itemView, Context context) {  //<-- no more adapter in constructor
        super(itemView);
        itemView.setOnClickListener(this);
        this.context = context;
        this.fav = (ImageButton) itemView.findViewById(R.id.btn_fav);
        name = (TextView) itemView.findViewById(R.id.Main_Text) ;
        num = (TextView) itemView.findViewById(R.id.Second_Text) ;
        img1 = (ImageView) itemView.findViewById(R.id.img1) ;
    }

    void bind (listitem_gib item) {  //<--bind method allows the ViewHolder to bind to the data it is displaying
        name.setText(item.getName());
        num.setText(item.getnum());
        Picasso.with(this.context).load("http://i-geeky.info/android/image/" + item.getimg()).into(holder.img1);
        currentItem = item; //<-- keep a reference to the current item
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this.context,Rewaya_info.class);
        intent.putExtra("name",currentItem.getName());  // <-- makes use of currentItem instead of adapter
        intent.putExtra("url",currentItem.geturl());
        intent.putExtra("img",currentItem.getimg());
        intent.putExtra("num",currentItem.getnum());
        intent.putExtra("size",currentItem.getsize());
        this.context.startActivity(intent);
    }
}
class ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
私有文本视图名称;
私有文本视图num;
私有图像视图img1;
图像按钮fav;
语境;

private listitem_gib currentItem;//您可以通过在回收器适配器java中编辑OnItemClickListener来完成此操作

像这样

 itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener!=null){
                    int position = getAdapterPosition();
                    String name = songListFiltered.get(position).getText1();
                    for (int i=0; i <songList.size(); i++){
                        if (name.equals(songList.get(i).getText1())){
                            position=i;
                            break;
                        }
                    }
                    if (position!=RecyclerView.NO_POSITION){
                        mListener.OnItemClick(position);
                    }

                }
            }
        });
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(mListener!=null){
int position=getAdapterPosition();
String name=songListFiltered.get(position.getText1();

对于(int i=0;i我遇到了与过滤结果相同的问题

actualList = [4, 6, 3, 8, 9, 5, 2]

filteredList = [4, 3, 5, 2] // lets say filtering with <= 5

希望有人觉得它有用。

请更具体地说明错误的性质。例如,我在
onClick()中看到
position
。这不是您期望的值吗?对不起,我的英语不好,我将尝试解释我在RecyclerView中使用卡片制作GridView,当我使用搜索时就像在RecyclerView中搜索名称一样,我得到了这个名称,但当我按“名称”时打开另一个名称,而不是我搜索的名称,我希望您能理解我您的英语足够好需要更具体地说明错误以及错误在代码中的位置。
position
是正确的值吗?
name
是正确的值吗?或者
name1
?仅搜索时位置错误,当我在main中时,在搜索前给出正确的位置,但在搜索项目后给出错误的位置您是geniu学生:)你节省了我的时间。
 itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener!=null){
                    int position = getAdapterPosition();
                    String name = songListFiltered.get(position).getText1();
                    for (int i=0; i <songList.size(); i++){
                        if (name.equals(songList.get(i).getText1())){
                            position=i;
                            break;
                        }
                    }
                    if (position!=RecyclerView.NO_POSITION){
                        mListener.OnItemClick(position);
                    }

                }
            }
        });
package com.jiunidengkw;

 import android.content.Context;
 import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.Filter;
  import android.widget.Filterable;
  import android.widget.TextView;

  import androidx.annotation.NonNull;
  import androidx.recyclerview.widget.RecyclerView;

   import java.util.ArrayList;
   import java.util.List;

   public class RecyclerAdapter extends                           RecyclerView.Adapter<RecyclerAdapter.ExampleViewHolder> implements Filterable {

private List<Item> songList;
private  Context context;
private List<Item> songListFiltered;
private List<Item> songListFull;
private OnItemClickListener mListener;

public interface  OnItemClickListener{
    void OnItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
    mListener=listener;
}






public class ExampleViewHolder extends RecyclerView.ViewHolder {
    TextView textView1;
    TextView textView2;

    ExampleViewHolder(final View itemView) {
        super(itemView);
        textView1 =(TextView) itemView.findViewById(R.id.text_view1);
        textView2 =(TextView) itemView.findViewById(R.id.text_view2);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener!=null){
                    int position = getAdapterPosition();
                    String name = songListFiltered.get(position).getText1();
                    for (int i=0; i <songList.size(); i++){
                        if (name.equals(songList.get(i).getText1())){
                            position=i;
                            break;
                        }
                    }
                    if (position!=RecyclerView.NO_POSITION){
                        mListener.OnItemClick(position);
                    }

                }
            }
        });
    }
}

public  RecyclerAdapter(Context context, List<Item> songList) {
    this.context = context;
    this.songListFiltered = songList;
    this.songList = songList;
}

@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,
            parent, false);
    return new ExampleViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {

    holder.textView1.setText(songListFiltered.get(position).getText1());
    holder.textView2.setText(songListFiltered.get(position).getText2());
}

@Override
public int getItemCount() {

    return songListFiltered.size();
}

@Override
public Filter getFilter() {
    return exampleFilter;
}

private Filter exampleFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String charString = charSequence.toString();

        if (charString.isEmpty()) {
            songListFiltered = songList;
        } else {
           ArrayList<Item> itemArrayList = new ArrayList<>();

            for (Item item : songList) {
                if (item.getText1().toLowerCase().contains(charString)||item.getText2().toLowerCase().contains(charString)) {
                    itemArrayList.add(item);

                }
            }
            songListFiltered =itemArrayList;
        }

        FilterResults item = new FilterResults();
        item.values = songListFiltered;

        return item;

    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults item) {
       songListFiltered = (ArrayList<Item>) item.values;
        notifyDataSetChanged();
    }
};
   }
actualList = [4, 6, 3, 8, 9, 5, 2]

filteredList = [4, 3, 5, 2] // lets say filtering with <= 5
// in onClick listener
val itemAtPosition = filteredList[position]
// actual item position can be obtained from actual list
val actualPosition = actualList.indexOf(itemAtPosition)