【发布时间】:2014-02-11 05:24:05
【问题描述】:
我向我的项目添加了列表视图,并从 API (json) 加载了它的数据。我使用自定义适配器加载数据。已成功加载数据。
然后我尝试将搜索功能添加到此列表视图。 我在我的适配器类中实现过滤器方法。
但它显示这样的错误。
02-11 10:48:07.751: W/IInputConnectionWrapper(30180): getSelectedText on inactive InputConnection
02-11 10:48:07.751: W/IInputConnectionWrapper(30180): setComposingText on inactive InputConnection
02-11 10:48:07.751: W/IInputConnectionWrapper(30180): getExtractedText on inactive InputConnection
02-11 10:48:16.391: W/Filter(30180): An exception occured during performFiltering()!
02-11 10:48:16.391: W/Filter(30180): java.lang.NullPointerException
02-11 10:48:16.391: W/Filter(30180): at com.example.rp.FevListAdapter$1.performFiltering(FevListAdapter.java:91)
02-11 10:48:16.391: W/Filter(30180): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
02-11 10:48:16.391: W/Filter(30180): at android.os.Handler.dispatchMessage(Handler.java:99)
02-11 10:48:16.391: W/Filter(30180): at android.os.Looper.loop(Looper.java:137)
02-11 10:48:16.391: W/Filter(30180): at android.os.HandlerThread.run(HandlerThread.java:60)
这是我的适配器类
public class FevListAdapter extends BaseAdapter implements Filterable{
private Context context;
List<String> listData;
private List<String> list;
public FevListAdapter(Context convertView, List<String> listData){
this.context = convertView;
this.listData = listData;
//this.list.addAll(listData);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listData.size();
}
................................
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final String text = listData.get(position);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.fev_rest_list, null);
}
TextView lblListHeader = (TextView) convertView
.findViewById(R.id.fav_list);
lblListHeader.setText(text);
return convertView;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
list = (List<String>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
// perform your search here using the searchConstraint String.
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < list.size(); i++) {
String dataNames = list.get(i);
if (dataNames.toLowerCase().startsWith(constraint.toString())) {
FilteredArrayNames.add(dataNames);
}
}
results.count = FilteredArrayNames.size();
results.values = FilteredArrayNames;
Log.e("VALUES", results.values.toString());
return results;
}
};
return filter;
}
}
这是我的活动代码。
public void ListDrwaer() {
listData = new ArrayList<String>();
try {
JSONObject jsonResponse = new JSONObject(strJson1);
JSONArray jsonMainNode = jsonResponse.optJSONArray("restaurants");
for (int i = 0; i < jsonMainNode.length(); i++) {
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
restName = jsonChildNode.optString("name");
String type = jsonChildNode.optString("type");
if(type.equals("restaurant")){
listData.add(restName);
}
}
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Error..." + e.toString(),
Toast.LENGTH_LONG).show();
}
if(restName!=null){
adapter = new FevListAdapter(Restaurant_List.this,listData);
list.setAdapter(adapter);
list.setTextFilterEnabled(true);
searchTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
Restaurant_List.this.adapter.getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
TextView textView = (TextView) arg1.findViewById(R.id.fav_list);
String text = textView.getText().toString();
Intent newActivity = new Intent(getBaseContext(),Fav_Tabs.class);
newActivity.putExtra("Rest_name", text);
startActivity(newActivity);
}
});
}
else{
text.setText("No data found...");
}
}
当用户在文本字段中输入字母并在同一个列表视图中加载时,我想加载数据。 谁能帮帮我。
【问题讨论】:
-
第 91 行你能指出什么?
-
@Raghunandan for (int i = 0; i
-
list为空。确保它已初始化并填充 -
@Raghunandan 我明白了。它应该是 listData。现在它在 logcat 中显示。但不在列表视图中。你有什么想法吗?
-
然后学习java如何初始化列表并填充它
标签: android android-listview filter adapter