【问题标题】:Search xml parse搜索 xml 解析
【发布时间】:2014-08-03 02:55:18
【问题描述】:

我是安卓新手。 我有一个试图使用 Java 搜索的 XML 文件。 (问题出在编辑文本中)。

my code need edit

如何进行从编辑文本中获取文本并在列表视图中过滤结果的搜索? 这是我的代码:

package com.search.xmlParsing;



public class MainActivity extends ListActivity {

public static final String LOGTAG = "EXPLORECA";
public static final String USERNAME = "pref_username";
public static final String VIEWIMAGE = "pref_viewimages";
private static final int TOUR_DETAIL_ACTIVITY = 1001;
private SharedPreferences settings;
private OnSharedPreferenceChangeListener listener;
private List<Tour> tours;
boolean isMyTours;
ToursDataSource datasource;
ArrayAdapter<Tour> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    /*
     * ArrayAdapter<Tour> adapter = new TourListAdapter(this, tours);
     * setListAdapter(adapter);
     */
    final EditText editText = (EditText) findViewById(R.id.editTextSearch);

    editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2,
                int arg3) {
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {
        MainActivity.this.adapter.getFilter().filter(arg0);
            /*
             * final Intent queryIntent = getIntent(); final String
             * queryAction = queryIntent.getAction(); if
             * (Intent.ACTION_SEARCH.equals(queryAction)) {
             * doSearchQuery(queryIntent, "onNewIntent()"); } else { //
             * mDeliveredByText
             * .setText("onNewIntent(), but no ACTION_SEARCH intent"); }
             */
        }
    });
    settings = PreferenceManager.getDefaultSharedPreferences(this);

    listener = new OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {
            MainActivity.this.refreshDisplay();
        }
    };
    settings.registerOnSharedPreferenceChangeListener(listener);

    datasource = new ToursDataSource(this);
    datasource.open();

    tours = datasource.findAll();
    if (tours.size() == 0) {
        createData();
        tours = datasource.findAll();
    }
    isMyTours = false;

    refreshDisplay();

}

public void refreshDisplay() {

    boolean viewImages = settings.getBoolean(VIEWIMAGE, true);

    if (viewImages) {
        ArrayAdapter<Tour> adapter = new TourListAdapter(this, tours);
        setListAdapter(adapter);
    } else {
        ArrayAdapter<Tour> adapter = new ArrayAdapter<Tour>(this,
                android.R.layout.simple_list_item_1, tours);
        setListAdapter(adapter);
    }

}

@Override
protected void onResume() {
    super.onResume();
    datasource.open();
}

@Override
protected void onPause() {
    super.onPause();
    datasource.close();
}

private void createData() {
    ToursPullParser parser = new ToursPullParser();
    List<Tour> tours = parser.parseXML(this);

    for (Tour tour : tours) {
        datasource.create(tour);
    }
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Tour tour = tours.get(position);
    Intent intent = new Intent(this, TourDetailActivity.class);
    intent.putExtra(".model.Tour", tour);
    intent.putExtra("isMyTours", isMyTours);
    startActivityForResult(intent, TOUR_DETAIL_ACTIVITY);

}

/*
 * @Override protected void onActivityResult(int requestCode, int
 * resultCode, Intent data) { super.onActivityResult(requestCode,
 * resultCode, data);
 * 
 * if (requestCode == TOUR_DETAIL_ACTIVITY && resultCode == -1) {
 * datasource.open(); tours = datasource.findMyTours(); refreshDisplay();
 * isMyTours = true;
 * 
 * } }
 */
/*
 * private void doSearchQuery(final Intent queryIntent, final String
 * entryPoint) {
 * 
 * // The search query is provided as an "extra" string in the query intent
 * final String queryString =
 * queryIntent.getStringExtra(SearchManager.QUERY); //
 * mQueryText.setText(queryString);
 * 
 * // Record the query string in the recent queries suggestions provider. //
 * SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
 * // SearchSuggestionSampleProvider.AUTHORITY,
 * SearchSuggestionSampleProvider.MODE); //
 * suggestions.saveRecentQuery(queryString, null); final Bundle appData =
 * queryIntent.getBundleExtra(SearchManager.APP_DATA); if (appData == null)
 * { // mAppDataText.setText("<no app data bundle>"); } if (appData != null)
 * { String testStr = appData.getString("demo_key"); //
 * mAppDataText.setText((testStr == null) ? "<no app data>" : testStr); }
 * 
 * // mDeliveredByText.setText(entryPoint);
 * 
 * }
 */
}

但它强制关闭!!!!

这是日志猫:

08-04 07:10:51.045: E/AndroidRuntime(11234): FATAL EXCEPTION: main
08-04 07:10:51.045: E/AndroidRuntime(11234): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.search.xmlParse/com.search.xmlParsing.MainActivity2}:         java.lang.NullPointerException
08-04 07:10:51.045: E/AndroidRuntime(11234):    at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.app.ActivityThread.access$1500(ActivityThread.java:123)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.os.Looper.loop(Looper.java:130)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.app.ActivityThread.main(ActivityThread.java:3835)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at java.lang.reflect.Method.invokeNative(Native Method)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at java.lang.reflect.Method.invoke(Method.java:507)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at dalvik.system.NativeStart.main(Native Method)
08-04 07:10:51.045: E/AndroidRuntime(11234): Caused by: java.lang.NullPointerException
08-04 07:10:51.045: E/AndroidRuntime(11234):    at com.search.xmlParsing.MainActivity2.refreshDisplay(MainActivity2.java:63)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at com.search.xmlParsing.MainActivity2.onCreate(MainActivity2.java:58)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-04 07:10:51.045: E/AndroidRuntime(11234):    at            android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
08-04 07:10:51.045: E/AndroidRuntime(11234):    ... 11 more

【问题讨论】:

    标签: android xml parsing search


    【解决方案1】:

    我有另一种搜索列表的方法,希望对您有所帮助。

    我看到了您的代码,并在两个类中进行了更改。在MainActivity 中,我将ListActivity 更改为Activity,代码为:

        public class MainActivity2 extends Activity implements OnItemClickListener,
                TextWatcher {
    
            public static final String LOGTAG = "EXPLORECA";
            public static final String USERNAME = "pref_username";
            public static final String VIEWIMAGE = "pref_viewimages";
            private static final int TOUR_DETAIL_ACTIVITY = 1001;
            private SharedPreferences settings;
            private OnSharedPreferenceChangeListener listener;
            private List<Tour> tours;
            boolean isMyTours;
            ToursDataSource datasource;
    
            private TourListAdapter2 mAdapter;
            private ListView lviTours;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
                setContentView(R.layout.main);
    
                final EditText editText = (EditText) findViewById(R.id.editTextSearch);
    
                lviTours = (ListView) findViewById(android.R.id.list);
                lviTours.setOnItemClickListener(this);
    
                editText.addTextChangedListener(this);
                datasource = new ToursDataSource(this);
                datasource.open();
    
    settings = PreferenceManager.getDefaultSharedPreferences(this);
    
            listener = new OnSharedPreferenceChangeListener() {
    
                @Override
                public void onSharedPreferenceChanged(
                        SharedPreferences sharedPreferences, String key) {
                    MainActivity.this.refreshDisplay();
                }
            };
            settings.registerOnSharedPreferenceChangeListener(listener);
    
                tours = datasource.findAll();
                if (tours.size() == 0) {
                    createData();
                    tours = datasource.findAll();
                }
                isMyTours = false;
                refreshDisplay();
            }
    
            public void refreshDisplay() {
    
                boolean viewImages = settings.getBoolean(VIEWIMAGE, true);
    
                if (viewImages) {
                    // ArrayAdapter<Tour> adapter = new TourListAdapter(this, tours);
                    // setListAdapter(adapter);
                    mAdapter = new TourListAdapter2(this, tours);
                    lviTours.setAdapter(mAdapter);
                } else {
    
                    mAdapter = new TourListAdapter2(this, tours);
                    lviTours.setAdapter(mAdapter);
                    // ArrayAdapter<Tour> adapter = new ArrayAdapter<Tour>(this,
                    // android.R.layout.simple_list_item_1, tours);
                    // setListAdapter(adapter);
                }
    
            }
    
            @Override
            protected void onResume() {
                super.onResume();
                datasource.open();
            }
    
            @Override
            protected void onPause() {
                super.onPause();
                datasource.close();
            }
    
            private void createData() {
                ToursPullParser parser = new ToursPullParser();
                List<Tour> tours = parser.parseXML(this);
    
                for (Tour tour : tours) {
                    datasource.create(tour);
                }
            }
    
            /*********** SEARCH ****************/
            @Override
            public void afterTextChanged(Editable arg0) {
    
            }
    
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                mAdapter.getFilter().filter(cs);
    
            }
    
            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int position,
                    long id) {
                Tour tour = tours.get(position);
                Intent intent = new Intent(this, TourDetailActivity.class);
                intent.putExtra(".model.Tour", tour);
                intent.putExtra("isMyTours", isMyTours);
                startActivityForResult(intent, TOUR_DETAIL_ACTIVITY);
    
            }
    
        }
    

    我创建了另一个类TourListAdapter2,它扩展 BaseAdapter实现 Filterable 以在列表中搜索。代码是:

    公共类 TourListAdapter2 扩展 BaseAdapter 实现 Filterable {

    private LayoutInflater mInflater;
    List<Tour> mList;
    List<Tour> mFilter;
    List<Tour> tours;
    private Context mContext;
    
    public TourListAdapter2(Context context, List<Tour> tours) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        mList = tours;
        mFilter = tours;
    }
    
    @Override
    public int getCount() {
    
        return mFilter.size();
    }
    
    @Override
    public Object getItem(int position) {
        return mFilter.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return mFilter.get(position).getId();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
    
        Tour tour = (Tour) getItem(position);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listitem, null);
            viewHolder = new ViewHolder();
            viewHolder.tviName = (TextView) convertView
                    .findViewById(R.id.titleText);
    
            viewHolder.iviImage = (ImageView) convertView
                    .findViewById(R.id.imageView1);
    
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        viewHolder.tviName.setText(tour.getTitle());
    
        int imageResource = mContext.getResources().getIdentifier(
                tour.getImage(), "drawable", mContext.getPackageName());
        if (imageResource != 0) {
            viewHolder.iviImage.setImageResource(imageResource);
        }
    
        return convertView;
    }
    
    class ViewHolder {
        public TextView tviName;
        public ImageView iviImage;
    }
    
    /*********** SEARCH **********/
    @Override
    public Filter getFilter() {
    
        return new Filter() {
    
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                    FilterResults results) {
                mFilter = (List<Tour>) results.values;
                notifyDataSetChanged();
            }
    
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
    
                FilterResults results = new FilterResults();
    
                if (charSequence == null || charSequence.length() == 0) {
                    results.values = mList;
                    results.count = mList.size();
                } else {
                    ArrayList<Tour> filterResultsData = new ArrayList<Tour>();
    
                    for (Tour data : mList) {
    
                        if (data.getTitle().contains(charSequence)) {
                            filterResultsData.add(data);
                        }
                    }
    
                    results.values = filterResultsData;
                    results.count = filterResultsData.size();
                }
    
                return results;
            }
        };
    }
    

    }

    【讨论】:

    • 谢谢,但仍然强制关闭。请看我的日志猫。
    • 我看到了错误,这是因为“设置”,我编辑了我的答案
    【解决方案2】:

    确保有一个带有 id=editTextSearch 的 EditText 的 xml 文件

        <EditText
            android:id="@+id/editTextSearch"
            ...
        />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多