我正在尝试使用顶部的搜索框创建一个简单的列表视图。哈米给出了一个很好的教程in this thread。但是,我在最后遇到了一个问题 - 有一行引用布局XML文件:
filterText = (EditText) findViewById(R.id.search_box);
Eclipse会抛出错误,因为'id'无法解析(或者不是字段)。我的布局XML文件包含以下内容:
<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a
ListActivity still! -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
我尝试了一些明显的修复,例如替换行
<EditText android:id="@+building_list/search_box"
使用:
<EditText android:id="@+id/search_box"
...这会删除错误,但如果我尝试将任何内容放入文本框,则应用程序崩溃。
我哪里出错了?为了完整起见,这是我的java文件的内容:
package mjd.listview.test;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.R.id;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import au.com.bytecode.opencsv.CSVReader;
public class ListProjectActivity extends ListActivity {
private EditText filterText = null; // used in filtering the list
ArrayAdapter<String> adapter = null; // used in filtering the list
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview); // load the layout file 'filterable_listview.xml'
filterText = (EditText) findViewById(R.id.search_box); // used in filtering the list
filterText.addTextChangedListener(filterTextWatcher); // used in filtering the list
String next[] = {}; // 'next' is used to iterate through dictionaryFile
List<String[]> dictionaryArray = new ArrayList<String[]>();
try {
CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("dictionaryFile.csv")));
while((next = reader.readNext()) != null) {
dictionaryArray.add(next);
}
} catch (IOException e) {
e.printStackTrace();
}
String[] terms = dictionaryArray.get(0); // load terms from dictionaryArray
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() { // when an item is clicked on...
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
AlertDialog alertDialog = new AlertDialog.Builder(ListProjectActivity.this).create(); // create a dialog box in memory
alertDialog.setTitle(((TextView) view).getText()); // set title of dialog box to term name
alertDialog.setMessage("Put definition here"); // set dialog box message to term definition
alertDialog.show(); // actually display the dialog box
}
});
}
// The whole block below is used in filtering the list
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}
}
编辑:我怀疑这是因为我后来使用了不同的列表布局(参见下面的行)
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));
也许'list_item'需要像'android:id / list'?但是我无法正确地使用它来正确引用它...任何想法?
答案 0 :(得分:3)
我怀疑你的错误完全是另一个问题(与R.id.search_box无关)
使用时
android:id="@+building_list/search_box"
您需要使用
引用它findViewById(R.building_list.search_box)
在您的情况下,使用
android:id="@+id/search_box"
(您已尝试过)将解决第一个问题,因为您使用
引用它findViewById(R.id.search_box)
完成后,你的logcat表明在onTextChanged方法中发生了NullPointerException。根据我的经验,这通常是一个尚未初始化的对象引用,或与数组相关的问题。在你的情况下,你正在打电话
adapter.getFilter().filter(s);
在onTextChanged方法中,但看起来你实际上没有在代码中的任何地方设置适配器。从我可以收集到的这个应该做的,尝试替换
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, terms));
与
adapter= new ArrayAdapter<String>(this, R.layout.list_item, terms));
setListAdapter(adapter);
答案 1 :(得分:1)
您导入 android.R.id 而不是 mjd.listview.test.R (或类似的东西)
让我们看一下使用R的指南: http://developer.android.com/guide/topics/resources/accessing-resources.html
答案 2 :(得分:0)
请发布logcat
我认为问题不在于布局,
是onTextChanged
方法中的例外。我认为适配器为空,adapter.getFilter().filter(s)
抛出异常。