Java 在RecyclerView中如何定位?

Java 在RecyclerView中如何定位?,java,android,android-recyclerview,Java,Android,Android Recyclerview,所以我有一个小问题,我有一个巨大的回收视图(7000件物品),我把它填满了生成的卡片,上面有大学信息,右边有一个按钮。我附上了一张照片,让你明白我的意思。问题是:当我点击“详细信息”按钮时,我想获取名称和ID,以便稍后可以从SQLite数据库查询其余的学院信息,但当我向下滚动并点击按钮时,它有时会返回其他学院的信息,而不是我想要的信息。第一个总是按预期的方式工作。以下是适配器代码: public class CustomRecyclerAdapter extends RecyclerView.A

所以我有一个小问题,我有一个巨大的回收视图(7000件物品),我把它填满了生成的卡片,上面有大学信息,右边有一个按钮。我附上了一张照片,让你明白我的意思。问题是:当我点击“详细信息”按钮时,我想获取名称和ID,以便稍后可以从SQLite数据库查询其余的学院信息,但当我向下滚动并点击按钮时,它有时会返回其他学院的信息,而不是我想要的信息。第一个总是按预期的方式工作。以下是适配器代码:

public class CustomRecyclerAdapter extends RecyclerView.Adapter<CustomRecyclerAdapter.CustomViewHolder> implements Filterable {

    private List<CollegeItem> collegeList;
    private List<CollegeItem> collegeListFull;
    private ItemClickListener itemClickListener;
    private Context context;
    private Button details;
    private DatabaseCollege collegeDB;

    public CustomRecyclerAdapter(List<CollegeItem> collegeList, Context context) {
        this.collegeList = collegeList;
        this.context = context;
        collegeListFull = new ArrayList<>(collegeList);
    }

    @NonNull
    @Override
    public CustomRecyclerAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.college_item, parent, false);
        return new CustomRecyclerAdapter.CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(CustomRecyclerAdapter.CustomViewHolder holder, int position) {
        final String id = collegeList.get(position).getId();
        final String name = collegeList.get(position).getName();
        holder.name.setText(collegeList.get(position).getName());
        holder.id.setText(collegeList.get(position).getId());
        details.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println(id + " - " + name); //This sometimes gives information of incorrect college when clicked
            }
        });
    }

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

    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

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

    public Filter getFilterName() {
        return collegeFilterName;
    }

    private Filter collegeFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<CollegeItem> filteredList = new ArrayList<>();

            if(constraint == null || constraint.length() == 0) {
                filteredList.addAll(collegeListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for(CollegeItem college : collegeListFull) {
                    if(college.getName().toLowerCase().contains(filterPattern)) {
                        filteredList.add(college);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            collegeList.clear();
            collegeList.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    private Filter collegeFilterName = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<CollegeItem> filteredList = new ArrayList<>();

            if(constraint == null || constraint.length() == 0) {
                filteredList.addAll(collegeListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for(CollegeItem college : collegeListFull) {
                    if(college.getId().toLowerCase().contains(filterPattern)) {
                        filteredList.add(college);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            collegeList.clear();
            collegeList.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView name, id;

        public CustomViewHolder(View v) {
            super(v);
            name = v.findViewById(R.id.college_name);
            id = v.findViewById(R.id.college_id);
            details = v.findViewById(R.id.btn_college_details);
        }

        @Override
        public void onClick(View v) {
            if(itemClickListener != null) {
                itemClickListener.onClick(v, getAdapterPosition());
            }
        }
    }
}
公共类CustomRecyclerAdapter扩展了RecyclerView。适配器实现可过滤{
私家书友;
私人名单学院全部;
私有项ClickListener项ClickListener;
私人语境;
私人按钮详情;
私立数据库学院数据库;
公共CustomRecyclerAdapter(列表collegeList,上下文){
this.collegeList=collegeList;
this.context=上下文;
collegeListFull=新阵列列表(collegeList);
}
@非空
@凌驾
public CustomRecyclerAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View itemView=LayoutFlater.from(上下文)。充气(R.layout.college\u项,父项,false);
返回新的CustomRecyclerAdapter.CustomViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(CustomRecyclerAdapter.CustomViewHolder,int位置){
最后一个字符串id=colleclist.get(position.getId();
最后一个字符串名=colleclist.get(position.getName();
holder.name.setText(colleclist.get(position.getName());
holder.id.setText(colleclist.get(position.getId());
details.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
System.out.println(id+“-”+name);//这有时会在单击时提供错误学院的信息
}
});
}
@凌驾
public int getItemCount(){
返回collegeList.size();
}
public void setItemClickListener(ItemClickListener ItemClickListener){
this.itemClickListener=itemClickListener;
}
@凌驾
公共过滤器getFilter(){
返回收集过滤器;
}
公共筛选器getFilterName(){
返回collegeFilterName;
}
专用筛选器collegeFilter=新筛选器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
List filteredList=新建ArrayList();
if(constraint==null | | constraint.length()==0){
filteredList.addAll(collegeListFull);
}否则{
String filterPattern=constraint.toString().toLowerCase().trim();
适用于(学院临时学院:学院全员){
if(college.getName().toLowerCase().contains(filterPattern)){
filteredList.add(学院);
}
}
}
FilterResults results=新的FilterResults();
results.values=filteredList;
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
大学教师;
collegeList.addAll((列表)results.values);
notifyDataSetChanged();
}
};
专用筛选器collegeFilterName=新筛选器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
List filteredList=新建ArrayList();
if(constraint==null | | constraint.length()==0){
filteredList.addAll(collegeListFull);
}否则{
String filterPattern=constraint.toString().toLowerCase().trim();
适用于(学院临时学院:学院全员){
if(college.getId().toLowerCase().contains(filterPattern)){
filteredList.add(学院);
}
}
}
FilterResults results=新的FilterResults();
results.values=filteredList;
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
大学教师;
collegeList.addAll((列表)results.values);
notifyDataSetChanged();
}
};
公共类CustomViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
TextView名称、id;
公共CustomViewHolder(视图v){
超级(五);
name=v.findviewbyd(R.id.college\u name);
id=v.findviewbyd(R.id.college\u id);
详细信息=v.findviewbyd(R.id.btn\u学院详细信息);
}
@凌驾
公共void onClick(视图v){
如果(itemClickListener!=null){
onClick(v,getAdapterPosition());
}
}
}
}
我不知道确切的原因,但这似乎是一个定位问题,也许?因为当我滚动并单击时,输出的信息似乎发生了变化。怎样才能以我想要的方式从卡片中获取信息

以防万一,这里是recycler视图所在的片段java代码:

public class CollegeFragment extends Fragment implements ItemClickListener{

    private RecyclerView recyclerView;
    private CustomRecyclerAdapter customRecyclerAdapter;
    private List<CollegeItem> collegeItemList = new ArrayList<>();
    private DatabaseCollege dbCollege;
    private EditText cName, cId;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View myFragmentView = inflater.inflate(R.layout.fragment_college, container, false);

        dbCollege = new DatabaseCollege(getActivity());

        recyclerView = myFragmentView.findViewById(R.id.recycler);
        customRecyclerAdapter = new CustomRecyclerAdapter(dbCollege.getCollegeData(), getActivity());

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(customRecyclerAdapter);
        customRecyclerAdapter.setItemClickListener(this);

        cId = myFragmentView.findViewById(R.id.et_ipeds);
        cId.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                cName.getText().clear();
                CollegeFragment.this.customRecyclerAdapter.getFilter().filter(s);
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        cName = myFragmentView.findViewById(R.id.et_name);
        cName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                cId.getText().clear();
                CollegeFragment.this.customRecyclerAdapter.getFilterName().filter(s);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        return myFragmentView;

    }

    @Override
    public void onClick(View v, int position) {
        String name = collegeItemList.get(position).getName();
        String id = collegeItemList.get(position).getId();
    }
}
公共类CollegeFragment扩展片段实现ItemClickListener{
私人回收站;
私人CustomRecyclerAdapter CustomRecyclerAdapter;
private List collegeItemList=new ArrayList();
私立数据库学院;
私有编辑文本cName,cId;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//对布局进行充气,以便
public class CustomRecyclerAdapter extends RecyclerView.Adapter<CustomRecyclerAdapter.CustomViewHolder> implements Filterable {

    private List<CollegeItem> collegeList;
    private List<CollegeItem> collegeListFull;
    private ItemClickListener itemClickListener;
    private Context context;
    private DatabaseCollege collegeDB;

    public CustomRecyclerAdapter(List<CollegeItem> collegeList, Context context) {
        this.collegeList = collegeList;
        this.context = context;
        collegeListFull = new ArrayList<>(collegeList);
    }

    @NonNull
    @Override
    public CustomRecyclerAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.college_item, parent, false);
        return new CustomRecyclerAdapter.CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(CustomRecyclerAdapter.CustomViewHolder holder, int position) {
        final String id = collegeList.get(position).getId();
        final String name = collegeList.get(position).getName();
        holder.name.setText(collegeList.get(position).getName());
        holder.id.setText(collegeList.get(position).getId());
    }

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

    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

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

    public Filter getFilterName() {
        return collegeFilterName;
    }

    private Filter collegeFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<CollegeItem> filteredList = new ArrayList<>();

            if(constraint == null || constraint.length() == 0) {
                filteredList.addAll(collegeListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for(CollegeItem college : collegeListFull) {
                    if(college.getName().toLowerCase().contains(filterPattern)) {
                        filteredList.add(college);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            collegeList.clear();
            collegeList.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    private Filter collegeFilterName = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<CollegeItem> filteredList = new ArrayList<>();

            if(constraint == null || constraint.length() == 0) {
                filteredList.addAll(collegeListFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for(CollegeItem college : collegeListFull) {
                    if(college.getId().toLowerCase().contains(filterPattern)) {
                        filteredList.add(college);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            collegeList.clear();
            collegeList.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };

    public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView name, id;
        Button details; // Button should be here

        public CustomViewHolder(View v) {
            super(v);
            name = v.findViewById(R.id.college_name);
            id = v.findViewById(R.id.college_id);
            details = v.findViewById(R.id.btn_college_details);

            details.setOnClickListener(this); // set click listener here instead
        }

        @Override
        public void onClick(View v) {
            if(itemClickListener != null) {
                itemClickListener.onClick(v, getAdapterPosition());
            }
        }
    }
}