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