首页 > 解决方案 > 无法过滤自定义适配器数据来自 mysql 数据库

问题描述

我是 android 新手。在我的应用程序中,我创建了一个自定义列表,列表数据来自 mysql 数据库。我已经完成了那部分,但现在我被困在使用搜索视图过滤该数据。我搜索了几个小时但找不到任何东西像这样..

列出活动

    //onCreatemethod
    new task2().execute();

    lv3 = (ListView)findViewById(R.id.lv3);
    sv = (SearchView)findViewById(R.id.sv);
    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            customStockList.getFilter().filter(s);//customStockList is adapter
            customStockList.notifyDataSetChanged();
            return false;
        }
    });


}

private class task2 extends AsyncTask<String, String, Void> {

    InputStream is = null;
    String result = "";

    @Override
    protected Void doInBackground(String... params) {

        String url_select = "http://mybusket.com/webapi/pbs/istock/get_item_stock.php";

        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url_select);

        ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
        try {
            httpGet.setURI(new URI(url_select));

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();

            // read content
            is = httpEntity.getContent();

        } catch (Exception e) {

            Log.e("log_tag", "Error in http connection " + e.toString());
        }
        try {
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();

        } catch (Exception e) {
            // TODO: handle exception
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        try {
            lv3 = (ListView)findViewById(R.id.lv3);
            lv3.setAdapter(customStockList);
            JSONObject object = new JSONObject(result);
            JSONArray jsonArray = object.getJSONArray("itemstock");
            for (int i = 0; i < jsonArray.length(); i++)
            {
                JSONObject obj = jsonArray.getJSONObject(i);
                StockData stockData = new StockData();
                stockData.setModelno(obj.getString("modelno"));
                stockData.setStock(obj.getString("stock"));
                //stockData.setItem(obj.getString("modelno"));

                stockList.add(stockData);
            }
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }
          CustomStockList adapter = new CustomStockList(StockList.this, stockList);
        lv3.setAdapter(adapter);
    }
}

我在我的列表中完美地检索了所有数据......

自定义适配器

private Activity activity;
private LayoutInflater inflater;
private List<StockData> Items;
private List<StockData> FilteredItems;

public CustomStockList(Activity activity, List<StockData> Items) {
    this.activity = activity;
    this.Items = Items;
    this.FilteredItems = Items;
}

@Override
public int getCount() {
    return FilteredItems.size();
}

@Override
public Object getItem(int location) {
    return FilteredItems.get(location);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.activity_custom_stock_list, null,true);

    TextView model = (TextView)convertView.findViewById(R.id.model);
    TextView stock = (TextView)convertView.findViewById(R.id.stock);

    // getting data for the row
    StockData m = FilteredItems.get(position);

    model.setText(m.getModelno());
    stock.setText(m.getStock());

    return convertView;
}


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

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

            FilteredItems = (List<StockData>) results.values;
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();

            if (constraint != null && constraint.toString().length() > 0) {
                List<StockData> filteredItems = new ArrayList<StockData>();
                for (int i = 0; i < Items.size(); i++) {
                    StockData data = Items.get(i);
                    // your filtering condition
                    // if `data` is elligilbe in the filter then add it to Filtered Items
                    // FilteredItems.add(data)
                }

                results.count = FilteredItems.size();
                results.values = FilteredItems;

            }
            else
            {
                synchronized (this) {
                    results.values = Items;
                    results.count = Items.size();
                }
            }
            return results;
        }
    };

    return filter;
}

这是我的带有自定义适配器的列表视图代码..现在我想通过搜索过滤列表...请帮助我。

标签: android

解决方案


在您的适配器中实现Filterable并覆盖过滤器功能,如下所示

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

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

                items = (List<StockData>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();

                if (constraint != null && constraint.toString().length() > 0) {
                    List<YourModel> filteredItems = new ArrayList<UserData>();
                    for (int i = 0; i < tempList.size(); i++) {
                        StockData data = tempList.get(i);
                        // Add your filtering condition here
                        if(isFiltered) {
                            // if item is eligible for filter add
                            filteredItems.add(data);
                        }
                    }

                    results.count = filteredItems.size();
                    results.values = filteredItems;

                }
                else
                {
                    synchronized (this) {
                        results.values = tempList;
                        results.count = tempList.size();
                    }
                }
                return results;
            }
        };

        return filter;
    }

在您的活动中调用 ListView 过滤器,如下所示

yourAdapter.getFilter().filter("string to filter");
yourAdapter.notifyDataSetChanged();

在类级别定义了filteredItems数组并使用filteredItems数组设置在适配器中,将items数组保持为原始列表,没有任何过滤器

你的适配器看起来像这样

private Activity activity;
private LayoutInflater inflater;
private List<StockData> Items;
private List<StockData> FilteredItems;

public CustomStockList(Activity activity, List<StockData> Items) {
    this.activity = activity;
    this.Items = Items;
    thils.FilteredItems = Items;
}

@Override
public int getCount() {
    return FilteredItems.size();
}

@Override
public Object getItem(int location) {
    return FilteredItems.get(location);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.activity_custom_stock_list, null,true);

    TextView model = (TextView)convertView.findViewById(R.id.model);
    TextView stock = (TextView)convertView.findViewById(R.id.stock);

    // getting data for the row
    StockData m = FilteredItems.get(position);

    model.setText(m.getModelno());
    stock.setText(m.getStock());

    return convertView;
}

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

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

            FilteredItems = (List<StockData>) results.values;
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();

            if (constraint != null && constraint.toString().length() > 0) {
                List<StockData> filteredItems = new ArrayList<StockData>();
                for (int i = 0; i < Items.size(); i++) {
                    StockData data = Items.get(i);
                    if(data.getModelno().contains(constraint.toString())) {
                       FilteredItems.add(data);
                    }
                    // your filtering condition
                    // if `data` is elligible in the filter then add it to Filtered Items
                    // FilteredItems.add(data)
                }

                results.count = FilteredItems.size();
                results.values = FilteredItems;

            }
            else
            {
                synchronized (this) {
                    results.values = Items;
                    results.count = Items.size();
                }
            }
            return results;
        }
    };

    return filter;
}

将您的列表设置为适配器

      @Override
        protected void onPostExecute(Void aVoid) {
            try {
                lv3 = (ListView)findViewById(R.id.lv3);
                lv3.setAdapter(customStockList);
                JSONObject object = new JSONObject(result);
                JSONArray jsonArray = object.getJSONArray("itemstock");
                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject obj = jsonArray.getJSONObject(i);
                    StockData stockData = new StockData();
                    stockData.setModelno(obj.getString("modelno"));
                    stockData.setStock(obj.getString("stock"));
                    //stockData.setItem(obj.getString("modelno"));

                    stockList.add(stockData);
                }
            } catch (JSONException e) {
                Log.e("log_tag", "Error parsing data " + e.toString());
            }

            CustomStockList adapter = new CustomerStockList(YourActivity.this, stockList);
            listView.setAdapter(adapter);
        }

在您的 SearchView 上,您可以像这样调用过滤器

// Add this add classLevel in your activity
  CustomStockList adapter;

 sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            adapter.getFilter().filter(s);
            adapter.notifyDataSetChanged();
            return true;
        }
    });

推荐阅读