android - 无法过滤自定义适配器数据来自 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;
}
这是我的带有自定义适配器的列表视图代码..现在我想通过搜索过滤列表...请帮助我。
解决方案
在您的适配器中实现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;
}
});
推荐阅读
- android - 如何正确实施 UMP SDK 以获得欧盟同意?
- mysql - 如何正确命名数据库列
- android-studio - 在 Android Studio 中使用全屏时隐藏第二个显示器上的任务栏
- python - 我想用 spotify 库从我所有喜欢的歌曲中制作一个播放列表
- sql-server - 将 yyyy-mm-dd-hh.mm.ss.ms 字符串转换为日期时间
- c - 学校c项目中的字符串BUG
- laravel - 如何获取我从 Laravel 上的 getRoutes 方法获得的路线的 guarded_name
- sql-server - 将 SQL SERVER 查询更改为 POSTGRES
- mysql - 运行总计,但使用常量而不是当前行添加前一行
- c# - 如何为我的播放器实现 2 种不同的下落速度?