【问题标题】:Custom listadapter addTextChangeListner error自定义 listadapter addTextChangeListner 错误
【发布时间】: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


【解决方案1】:
for (int i = 0; i < list.size(); i++) {

把这个改成

for (int i = 0; i < listData.size(); i++) {

或者您应该将list 与默认listData 值设置为临时存储。因为一旦搜索字段为空,您必须保留旧值。

listData = (List<String>) results.values;
notifyDataSetChanged();

因为您使用listData 作为适配器的数据提供者。

整个perfom函数都可以改成这个。

@Override
protected FilterResults performFiltering(CharSequence constraint) {
    if(list == null){
        list = listData;
    }
    FilterResults results = new FilterResults();
    // perform your search here using the searchConstraint String.

    constraint = constraint.toString().toLowerCase();
    if(constraint.length() == 0){
        results.count = list.size();
        results.values = list;
        list = null;
        return results;
    }
    ArrayList<String> FilteredArrayNames = new ArrayList<String>();
    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;
}

【讨论】:

  • 亲爱的它加载数据。显示在 logcat.not it in listview ne.
  • 列表变量从未初始化,这导致了 NPE。而且“亲爱的”听起来很正式。
  • 我可以知道如何初始化它吗?
  • 我已经修改了 performFiltering 函数的代码试试这个。确保您已按照我提到的那样在 publishResults 中进行了更改。
  • 很高兴知道它对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多