Android 使用ListView编辑文本

Android 使用ListView编辑文本,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,我知道这已经被介绍了很多次,但我不能让它工作。搜索筛选功能似乎无法与myListView一起正常工作。有人能帮我理解代码中的错误吗?从我的数据库中可以很好地提取结果,但即使在我在我的EditText字段中输入文本后,结果也不会被过滤。我试着用Watcher测试EditText的按键变化,除了我的列表过滤外,它工作正常 非常感谢 public class Interface extends Activity implements OnClickListener, AdapterView.O

我知道这已经被介绍了很多次,但我不能让它工作。搜索筛选功能似乎无法与my
ListView一起正常工作。有人能帮我理解代码中的错误吗?从我的数据库中可以很好地提取结果,但即使在我在我的
EditText
字段中输入文本后,结果也不会被过滤。我试着用Watcher测试
EditText
的按键变化,除了我的列表过滤外,它工作正常

非常感谢

public class Interface extends Activity implements OnClickListener,
    AdapterView.OnItemClickListener {

MyDbHelper mHelper;
SQLiteDatabase mDb;
Cursor mCursor;
SimpleCursorAdapter mAdapter, madapter;
ListView mList;
EditText returnsearch;
int textlength = 0;

public static final String TABLE_NAME = "hohom";
public static final String COL_SanID = "SandIdc";
public static final String COL_SanTitle = "SandTitleC";
public static final String COL_SanCat = "SandCatC";
public static final String COL_SanReadyin = "SandReadyinC";
public static final String COL_SandServing = "SandServingC";
public static final String COL_SandIngred = "SandIngredC";
public static final String COL_SandDirect = "SandDirectC";

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.recipesearch);

    mHelper = new MyDbHelper(this);
    mList = (ListView) findViewById(R.id.listlist);
    mList.setOnItemClickListener(this);
    mList.setTextFilterEnabled(true);


    returnsearch = (EditText) findViewById(R.id.searchrecipe);

    Bundle extrass = getIntent().getExtras();

    mDb = mHelper.getWritableDatabase();

    String Type = extrass.getString("CategoryType");

    String[] columns = new String[] {

    "_id", COL_SanID, COL_SanTitle, COL_SanCat, COL_SanReadyin,
            COL_SandServing, COL_SandIngred, COL_SandDirect };

    mCursor = mDb.query(TABLE_NAME, columns, COL_SanCat + "=" + "?",
            new String[] { Type }, null, null, null);

    final String[] headers = new String[] { MyDbHelper.COL_SanTitle,
            MyDbHelper.COL_SanReadyin, MyDbHelper.COL_SandServing };

    mAdapter = new SimpleCursorAdapter(this, R.layout.listtype, mCursor,
            headers, new int[] { R.id.listmaintitle, R.id.listreadyin,
                    R.id.listserving });

    mList.setAdapter(mAdapter);

}

@Override
protected void onResume() {

    super.onResume();

    returnsearch.addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

            mAdapter.getFilter().filter(s);
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        public void afterTextChanged(Editable s) {

            mAdapter.getFilter().filter(s);
            mAdapter.notifyDataSetChanged();
        }
    });
}

public void onClick(View v)

{

}

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    mCursor.moveToPosition(position);

    Intent b = new Intent(Interface.this, Recipe.class);

    String rowId = mCursor.getString(0);
    String Title = mCursor.getString(2);
    String Category = mCursor.getString(3);
    String Readyin = mCursor.getString(4);
    String Serving = mCursor.getString(5);
    String Ingredients = mCursor.getString(6);
    String Directions = mCursor.getString(7);

    b.putExtra("Title", Title);
    b.putExtra("Category", Category);
    b.putExtra("Readyin", Readyin);
    b.putExtra("Serving", Serving);
    b.putExtra("Ingredients", Ingredients);
    b.putExtra("Directions", Directions);

    startActivity(b);

}

}
公共类接口扩展活动实现OnClickListener,
AdapterView.OnItemClickListener{
mydbmhelper;
sqlitemdb数据库;
光标mCursor;
简单的适应,适应,适应;
ListView-mList;
编辑文本返回搜索;
int textlength=0;
公共静态最终字符串表_NAME=“hohom”;
公共静态最终字符串COL_SanID=“sandic”;
公共静态最终字符串COL_SanTitle=“sandtilec”;
公共静态最终字符串COL_SanCat=“SandCatC”;
公共静态最终字符串COL_SanReadyin=“sandreayinc”;
公共静态最终字符串COL_SandServing=“SandServingC”;
公共静态最终字符串COL_SandIngred=“SandIngredC”;
公共静态最终字符串COL_SandDirect=“SandDirect”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.recipesearch);
mHelper=新的MyDbHelper(此);
mList=(ListView)findViewById(R.id.listlist);
mList.setOnItemClickListener(此);
mList.setTextFilterEnabled(true);
returnsearch=(EditText)findViewById(R.id.searchrecipe);
Bundle extras=getIntent().getExtras();
mDb=mHelper.getWritableDatabase();
字符串类型=extrass.getString(“CategoryType”);
字符串[]列=新字符串[]{
“身份证”、身份证、身份证、身份证、身份证、身份证、,
COL_SandServing、COL_SandIngred、COL_SandDirect};
mCursor=mDb.query(表名、列、列)+“=”+”?”,
新字符串[]{Type},null,null,null);
最终字符串[]头=新字符串[]{MyDbHelper.COL_SanTitle,
MyDbHelper.COL_SanReadyin、MyDbHelper.COL_SandServing};
mAdapter=new SimpleCursorAdapter(this,R.layout.listtype,mCursor,
标题,新int[]{R.id.listmaintitle,R.id.listreadyin,
R.id.listserving});
mList.setAdapter(mAdapter);
}
@凌驾
受保护的void onResume(){
super.onResume();
returnsearch.addTextChangedListener(新的TextWatcher(){
public void onTextChanged(字符序列,int start,int before,
整数计数){
mAdapter.getFilter().filter;
}
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
//TODO自动生成的方法存根
}
公共无效后文本已更改(可编辑){
mAdapter.getFilter().filter;
mAdapter.notifyDataSetChanged();
}
});
}
公共void onClick(视图v)
{
}
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
移动位置(位置);
意图b=新意图(Interface.this、Recipe.class);
String rowId=mCursor.getString(0);
String Title=mCursor.getString(2);
字符串类别=mCursor.getString(3);
String Readyin=mCursor.getString(4);
字符串服务=mCursor.getString(5);
字符串成分=mCursor.getString(6);
字符串方向=mCursor.getString(7);
b、 putExtra(“标题”,标题);
b、 putExtra(“类别”,类别);
b、 putExtra(“读音”,读音);
b、 putExtra(“上菜”,上菜);
b、 额外(“配料”,配料);
b、 额外指示(“指示”,指示);
星触觉(b);
}
}

也许这就是您需要的:

mAdapter.setFilterQueryProvider(
    new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            return mDb.query(TABLE_NAME, columns, COL_SanCat + " = ? AND " + COL_SandIngred + " = ?", new String[] { Type, "%" + constraint + "%" }, null, null, null);
        }
    }
);
编辑


我添加了关键字return,这样它可能会编译,对不起。无论如何,如果用户输入“pickles”,这应该会显示包含pickles的所有三明治。

您是否尝试构建一个AutoCompleteTextView,但要使用EditText和ListView?不,我只想构建一个ListView,其中包含基于类别从DB提取的项目,并且我可以基于EditText搜索限制食谱的数量。例如:当用户输入Burger时,所有以Burger开头的项目都会显示在列表视图中。非常感谢!好的,我建议在SimpleCursorAdapter中添加一个
FilterQueryProvider
,这将告诉ListView它应该如何更新。你能给我一个例子吗?:-)谢谢山姆的回答。我现在正试图实现这一点。但我只需要确定这是否会在Watcher方法下实现?谢谢现在尝试使用一个简单的查询,它确实得到了一些只按类别排序的结果(只是为了测试),但我意识到,当我尝试在edittext中输入任何字母时,所有结果都会消失,如果我正确地编写了所需的单词(所有单词),则会显示过滤的项目。我怎样才能消除这种情况?我希望在用户完成单词之前显示所有项目(如果确实有匹配项)。谢谢嗯,如果您忽略FilterQueryProvider并尝试更新
mCursor=mDb.query(表名、列、列、新字符串[]{s.toString()},null、null、null)在您的后文本更改函数中?我从来没有使用过文本监听器…我尝试过这个,但它不起作用。没有在edittext中写入任何内容。能否在beforeTextChanged()中将
mList
的适配器设置为null,并调用
mList.setAdapter(mAdapter)当您在PostTextChanged()中完成键入时?