当搜索功能启动并更新适配器时,自定义 ListView 会删除列表项中除匹配搜索值之外的所有内容
when the search function starts and the adapter is updated the custom ListView removes every thing in the list item except the matching search value
Image 1 : before any search performed
Image 2 : after search performed
public class classBidAdapter extends ArrayAdapter<classBidAttributes>
implements Filterable {
ArrayList<classBidAttributes> data;
Context context;
CustemFilrer filter;
//------this is a snippit of my listview custom adapter related to the search/filter function----------------------------------------------------------
@NonNull
@Override
public Filter getFilter() {
if(filter == null){
filter = new CustemFilrer();
}
return filter;
}
class CustemFilrer extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null && constraint.length()>0){
constraint = constraint.toString();
ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>();
for(int i =0; i<data.size();i++){
if(data.get(i).getTitle().contains(constraint)){
classBidAttributes filts = new classBidAttributes(data.get(i).getTitle());
filter.add(filts);
Toast.makeText(Context, "111"+filts, Toast.LENGTH_SHORT).show();
}
}
results.count = filter.size();
results.values=filter;
Toast.makeText(Context, "222"+filter.size() +" / "+filter, Toast.LENGTH_SHORT).show();
}else{
results.count = data.size();
results.values=data;
Toast.makeText(Context, ""+data.size() +" / "+data, Toast.LENGTH_SHORT).show();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data.clear();
data.addAll((ArrayList<classBidAttributes>) results.values);
notifyDataSetChanged();
}
}
我猜问题出在“data.clear()
,notifyDataSetChanged()
”,但我不确定这里出了什么问题。
我添加了图片来解释执行搜索时发生的情况。
希望这就是这个问题所需的一切,如果你需要检查任何东西问我。
你猜对了。你在 data.clear()
中犯了错误。通过这样做,您将清除适配器的完整数据并添加最后的搜索结果。所以下次得不到原始数据再开始过滤。
您应该将原始数据保存在另一个列表中,以便稍后使用您的适配器数据更新它。
你的代码应该是这样的:
public class classBidAdapter extends ArrayAdapter<classBidAttributes>
implements Filterable {
ArrayList<classBidAttributes> data;
ArrayList<classBidAttributes> original= new ArrayList<>();
Context context;
CustemFilrer filter;
public classBidAdapter(Context context, ArrayList<classBidAttributes> data){
this.context = context;
this.data = data;
original.addAll(data);
}
}
//------this is a snippit of my listview custom adapter related to the search/filter function----------------------------------------------------------
@NonNull
@Override
public Filter getFilter() {
if(filter == null){
filter = new CustemFilrer();
}
return filter;
}
class CustemFilrer extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null && constraint.length()>0){
constraint = constraint.toString();
ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>();
for(int i =0; i<data.size();i++) {
if (data.get(i).getTitle().contains(constraint)) {
classBidAttributes filts = new classBidAttributes(data.get(i).getTitle());
filter.add(filts);
Toast.makeText(Context, "111" + filts, Toast.LENGTH_SHORT).show();
}
}
results.count = filter.size();
results.values=filter;
Toast.makeText(Context, "222"+filter.size() +" / "+filter, Toast.LENGTH_SHORT).show();
}else{
results.count = original.size();
results.values=original;
Toast.makeText(Context, ""+original.size() +" / "+original, Toast.LENGTH_SHORT).show();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data.clear();
data.addAll((ArrayList<classBidAttributes>) results.values);
notifyDataSetChanged();
}
}
希望对您有所帮助:)
我终于设法让它正常工作,没有任何错误,结果是循环是问题的根源,最好避免正常的 for 循环,而是使用 foreach 循环,我不得不为搜索适配器从头开始重新编写整个代码,但如下所示:
public void filter(CharSequence constraint) {
constraint = constraint.toString();
data.clear();
if(constraint.length() == 0){
data.addAll(original);
}else{
for(classBidAttributes filts : original){
if(filts.getTitle().contains(constraint)
|| filts.getbidid().contains(constraint)
|| filts.getbid_offer().contains(constraint)
|| filts.getCategory().contains(constraint)
|| filts.getDescription().contains(constraint)
|| filts.getQuantity().contains(constraint)
|| filts.getRepetitive_requests_yes().contains(constraint)
|| filts.getRepetitive_requests_no().contains(constraint)
|| filts.getExpiry_date().contains(constraint)){
data.add(filts);
}
}
}
notifyDataSetChanged();
};
然而这个片段是基于你的回答 :)
Image 1 : before any search performed
Image 2 : after search performed
public class classBidAdapter extends ArrayAdapter<classBidAttributes>
implements Filterable {
ArrayList<classBidAttributes> data;
Context context;
CustemFilrer filter;
//------this is a snippit of my listview custom adapter related to the search/filter function----------------------------------------------------------
@NonNull
@Override
public Filter getFilter() {
if(filter == null){
filter = new CustemFilrer();
}
return filter;
}
class CustemFilrer extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null && constraint.length()>0){
constraint = constraint.toString();
ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>();
for(int i =0; i<data.size();i++){
if(data.get(i).getTitle().contains(constraint)){
classBidAttributes filts = new classBidAttributes(data.get(i).getTitle());
filter.add(filts);
Toast.makeText(Context, "111"+filts, Toast.LENGTH_SHORT).show();
}
}
results.count = filter.size();
results.values=filter;
Toast.makeText(Context, "222"+filter.size() +" / "+filter, Toast.LENGTH_SHORT).show();
}else{
results.count = data.size();
results.values=data;
Toast.makeText(Context, ""+data.size() +" / "+data, Toast.LENGTH_SHORT).show();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data.clear();
data.addAll((ArrayList<classBidAttributes>) results.values);
notifyDataSetChanged();
}
}
我猜问题出在“data.clear()
,notifyDataSetChanged()
”,但我不确定这里出了什么问题。
我添加了图片来解释执行搜索时发生的情况。
希望这就是这个问题所需的一切,如果你需要检查任何东西问我。
你猜对了。你在 data.clear()
中犯了错误。通过这样做,您将清除适配器的完整数据并添加最后的搜索结果。所以下次得不到原始数据再开始过滤。
您应该将原始数据保存在另一个列表中,以便稍后使用您的适配器数据更新它。
你的代码应该是这样的:
public class classBidAdapter extends ArrayAdapter<classBidAttributes>
implements Filterable {
ArrayList<classBidAttributes> data;
ArrayList<classBidAttributes> original= new ArrayList<>();
Context context;
CustemFilrer filter;
public classBidAdapter(Context context, ArrayList<classBidAttributes> data){
this.context = context;
this.data = data;
original.addAll(data);
}
}
//------this is a snippit of my listview custom adapter related to the search/filter function----------------------------------------------------------
@NonNull
@Override
public Filter getFilter() {
if(filter == null){
filter = new CustemFilrer();
}
return filter;
}
class CustemFilrer extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null && constraint.length()>0){
constraint = constraint.toString();
ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>();
for(int i =0; i<data.size();i++) {
if (data.get(i).getTitle().contains(constraint)) {
classBidAttributes filts = new classBidAttributes(data.get(i).getTitle());
filter.add(filts);
Toast.makeText(Context, "111" + filts, Toast.LENGTH_SHORT).show();
}
}
results.count = filter.size();
results.values=filter;
Toast.makeText(Context, "222"+filter.size() +" / "+filter, Toast.LENGTH_SHORT).show();
}else{
results.count = original.size();
results.values=original;
Toast.makeText(Context, ""+original.size() +" / "+original, Toast.LENGTH_SHORT).show();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data.clear();
data.addAll((ArrayList<classBidAttributes>) results.values);
notifyDataSetChanged();
}
}
希望对您有所帮助:)
我终于设法让它正常工作,没有任何错误,结果是循环是问题的根源,最好避免正常的 for 循环,而是使用 foreach 循环,我不得不为搜索适配器从头开始重新编写整个代码,但如下所示:
public void filter(CharSequence constraint) {
constraint = constraint.toString();
data.clear();
if(constraint.length() == 0){
data.addAll(original);
}else{
for(classBidAttributes filts : original){
if(filts.getTitle().contains(constraint)
|| filts.getbidid().contains(constraint)
|| filts.getbid_offer().contains(constraint)
|| filts.getCategory().contains(constraint)
|| filts.getDescription().contains(constraint)
|| filts.getQuantity().contains(constraint)
|| filts.getRepetitive_requests_yes().contains(constraint)
|| filts.getRepetitive_requests_no().contains(constraint)
|| filts.getExpiry_date().contains(constraint)){
data.add(filts);
}
}
}
notifyDataSetChanged();
};
然而这个片段是基于你的回答 :)