在列表视图中搜索只会刷新整个列表,而不会将结果放入列表中

问题描述 投票:0回答:1

[我正在使用JSON从服务器获取数据,当我尝试在列表视图中搜索时,它只是刷新整个列表并且不对其进行叙述,但是当我调试时,我可以看到getfilter上的结果是正确的,它[C0 ]里面确实有过滤后的数据。仅listview.setadaptor在asynctask的onPostExecute内部完成。

这是我的适配器代码:

drugsFiltered = (ArrayList<drugs_json_data>) results.values;

这里是数据模型:

public class drugs_adaptor_listView extends ArrayAdapter<drugs_json_data> implements Filterable {

    ArrayList<drugs_json_data> drugs;
    ArrayList<drugs_json_data> drugsFiltered;
    Context context;
    int resource;

    public drugs_adaptor_listView(Context context, int resource, ArrayList<drugs_json_data> drugs) {
        super(context, resource, drugs);
        this.drugs = drugs;
        this.drugsFiltered = drugs;
        this.context = context;
        this.resource = resource;
    }


    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View r = convertView;
        ViewHolder viewHolder;

        if (r == null) {
            LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            r = layoutInflater.inflate(R.layout.row_layout_drugs, null, true);
            viewHolder = new ViewHolder(r);
            r.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) r.getTag();
        }

        drugs_json_data drugs_json_data = getItem(position);
        viewHolder.txtDrugId.setText(drugs_json_data.getDrugId());
        viewHolder.txtDrugName.setText(drugs_json_data.getDrugName());
        viewHolder.txtDrugCategory.setText(drugs_json_data.getDrugCategory());

        Picasso builder = new Picasso.Builder(context).build();
        builder.load(drugs_json_data.getDrugImage()).memoryPolicy(MemoryPolicy.NO_STORE).placeholder(R.drawable.ic_launcher_foreground).into(viewHolder.imageView);

        return r;
    }

    @NonNull
    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                drugsFiltered = (ArrayList<drugs_json_data>) results.values; // has the filtered values
                if (results.count>0) {
                    notifyDataSetChanged();  // notifies the data with new filtered values
                }else {
                    notifyDataSetInvalidated();
                }
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                ArrayList<drugs_json_data> FilteredArrList = new ArrayList<>();

                if (drugs == null) {
                    drugs = new ArrayList<>(drugsFiltered); // saves the original data in mOriginalValues
                }

                if (constraint == null || constraint.length() == 0) {

                    // set the Original result to return
                    results.count = drugs.size();
                    results.values = drugs;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < drugs.size(); i++) {
                        String data = drugs.get(i).getDrugName();
                        if (data.startsWith(constraint.toString())) {
                            FilteredArrList.add(new drugs_json_data(drugs.get(i).getDrugId(), drugs.get(i).getDrugName(), drugs.get(i).getDrugCategory(), drugs.get(i).getDrugImage()));
                        }
                    }
                    // set the Filtered result to return
                    results.count = FilteredArrList.size();
                    results.values = FilteredArrList;
                }
                return results;
            }
        };
        return filter;
    }

    class ViewHolder {
        TextView txtDrugId, txtDrugName, txtDrugCategory;
        ImageView imageView;

        ViewHolder(View v) {
            txtDrugId = v.findViewById(R.id.txtDrugId);
            txtDrugName = v.findViewById(R.id.txtDrugName);
            txtDrugCategory = v.findViewById(R.id.txtDrugCat);
            imageView = v.findViewById(R.id.ImageViewDrug);
        }
    }
}

这是主要的活动代码:

public class drugs_json_data {
    private String drugImage;
    private String drugName;
    private String drugCategory;
    private String drugId;

    public drugs_json_data(String drugImage, String drugName, String drugCategory, String drugId) {
        this.drugImage = drugImage;
        this.drugName = drugName;
        this.drugCategory = drugCategory;
        this.drugId = drugId;
    }

    public String getDrugImage() {
        return this.drugImage;
    }

    public void setDrugImage(String drugImage) {
        this.drugImage = drugImage;
    }

    public String getDrugName() {
        return this.drugName;
    }

    public void setDrugName(String drugName) {
        this.drugName = drugName;
    }

    public String getDrugCategory() {
        return this.drugCategory;
    }

    public void setDrugCategory(String drugCategory) {
        this.drugCategory = drugCategory;
    }

    public String getDrugId() {
        return this.drugId;
    }

    public void setDrugId(String drugId) {
        this.drugId = drugId;
    }
}

如果有人可以提供帮助,我将不胜感激。

android listview search android-arrayadapter
1个回答
0
投票

替换

© www.soinside.com 2019 - 2024. All rights reserved.