使用 TextWatcher 和 ListView
Working with TextWatcher and ListView
我有一个名为 lv_arr
的 String[]
,我的 activity 看起来像这样:
它包含一个 EditText
,下面是我使用此代码显示上面的 lv_arr[]
:
listView = (ListView) findViewById(R.id.listview);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,lv_arr);
listView.setAdapter(adapter);
目前lv_arr[]
只包含一个字符串(即"Notes"
),每当用户添加一个字符串时,它就会更新。我想在我的 EditText
上添加 TextWatcher
,所以我尝试了以下操作:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addLabelText"
android:hint="Add Label">
<requestFocus/>
</EditText>
有:
addLabelText = (EditText) findViewById(R.id.addLabelText);
addLabelText.addTextChangedListener(listWatcher);
}
private final TextWatcher listWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
System.out.println(s);
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
我想要一个最终输出,每当用户在其中输入任何内容时 EditText
,我列表中的重要值应该显示在它下面。当 EditText
变为空白状态时,下面的列表应显示所有元素。否则只有匹配的值应该是可见的。
我尝试使用 for 循环来获取匹配值,但我在某处犯了错误...
使用Filterable.
例如这里是post。
我认为你可以使用 filterable 来实现。
尝试如下:
private final TextWatcher listWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable editable) {
}
};
实现可过滤到适配器和如下代码
@Override
public Filter getFilter() {
if (itemFilter == null) {
itemFilter = new ItemFilter();
}
return itemFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final String searchString = constraint.toString().toLowerCase();
Log.i("TAG", "Query=>" + constraint);
final FilterResults filterResults = new FilterResults();
if (constraint != null && constraint.toString() != "") {
doctorsList.clear();
// search content in DoctorList list
for (i=0;i<itemNameArray.length();i++) {
if (itemNameArray[i].toLowerCase().contains(searchString)) {
arrayList.add(itemNameArray[i]);
}
}
filterResults.count = arrayList.size();
Log.i("TAG", "FilterResultCount=>" + filterResults.count);
filterResults.values = arrayList;
Log.i("TAG", "FilterResultValues=>" + filterResults.values);
} else {
filterResults.count = arrayList.size();
filterResults.values = arrayList;
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
arrayList = (ArrayList<String>) results.values;
notifyDataSetChanged();
Log.i("TAG", "SearchResult" + arrayList);
}
}
启用搜索过滤器
addLabelText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
MainActivity.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
所以,为了实现我想要的输出,我编写了如下代码:
1) 我将 EditText 更改为 SearchView
<SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addLabelText"
/>
2) 在 SearchView 上添加了 setOnQueryTextListener
addLabelText =(SearchView) findViewById(R.id.addLabelText);
addLabelText.setOnQueryTextListener(this);
3) 实现 QueryTextChangeListener
4)然后,
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
这里的适配器是我用于列表视图的适配器,
即
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,lv_arr);
listView.setAdapter(adapter);
参考Link:http://www.tutorialsbuzz.com/2014/08/android-filters-for-simple-listview.html
我在这里发布我的答案 - 可能对某人有用
我试图解决这个问题 - 当列表视图 -> 编辑文本有文本观察器时无法获得位置。
这是对我有用的解决方案:
获取视图中-
当我添加 text watcher 监听器来编辑文本时,我还添加了以下行
edittext.setTag(R.id.position,位置)
在你的 afterTextChanged -
整数位置 = edittext.getTag(R.id.position)
给出正确的位号,您可以根据位号进行修改
我有一个名为 lv_arr
的 String[]
,我的 activity 看起来像这样:
它包含一个 EditText
,下面是我使用此代码显示上面的 lv_arr[]
:
listView = (ListView) findViewById(R.id.listview);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,lv_arr);
listView.setAdapter(adapter);
目前lv_arr[]
只包含一个字符串(即"Notes"
),每当用户添加一个字符串时,它就会更新。我想在我的 EditText
上添加 TextWatcher
,所以我尝试了以下操作:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addLabelText"
android:hint="Add Label">
<requestFocus/>
</EditText>
有:
addLabelText = (EditText) findViewById(R.id.addLabelText);
addLabelText.addTextChangedListener(listWatcher);
}
private final TextWatcher listWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
System.out.println(s);
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
我想要一个最终输出,每当用户在其中输入任何内容时 EditText
,我列表中的重要值应该显示在它下面。当 EditText
变为空白状态时,下面的列表应显示所有元素。否则只有匹配的值应该是可见的。
我尝试使用 for 循环来获取匹配值,但我在某处犯了错误...
使用Filterable.
例如这里是post。
我认为你可以使用 filterable 来实现。
尝试如下:
private final TextWatcher listWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable editable) {
}
};
实现可过滤到适配器和如下代码
@Override
public Filter getFilter() {
if (itemFilter == null) {
itemFilter = new ItemFilter();
}
return itemFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final String searchString = constraint.toString().toLowerCase();
Log.i("TAG", "Query=>" + constraint);
final FilterResults filterResults = new FilterResults();
if (constraint != null && constraint.toString() != "") {
doctorsList.clear();
// search content in DoctorList list
for (i=0;i<itemNameArray.length();i++) {
if (itemNameArray[i].toLowerCase().contains(searchString)) {
arrayList.add(itemNameArray[i]);
}
}
filterResults.count = arrayList.size();
Log.i("TAG", "FilterResultCount=>" + filterResults.count);
filterResults.values = arrayList;
Log.i("TAG", "FilterResultValues=>" + filterResults.values);
} else {
filterResults.count = arrayList.size();
filterResults.values = arrayList;
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
arrayList = (ArrayList<String>) results.values;
notifyDataSetChanged();
Log.i("TAG", "SearchResult" + arrayList);
}
}
启用搜索过滤器
addLabelText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
MainActivity.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
所以,为了实现我想要的输出,我编写了如下代码:
1) 我将 EditText 更改为 SearchView
<SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addLabelText"
/>
2) 在 SearchView 上添加了 setOnQueryTextListener
addLabelText =(SearchView) findViewById(R.id.addLabelText);
addLabelText.setOnQueryTextListener(this);
3) 实现 QueryTextChangeListener 4)然后,
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
这里的适配器是我用于列表视图的适配器, 即
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,lv_arr);
listView.setAdapter(adapter);
参考Link:http://www.tutorialsbuzz.com/2014/08/android-filters-for-simple-listview.html
我在这里发布我的答案 - 可能对某人有用
我试图解决这个问题 - 当列表视图 -> 编辑文本有文本观察器时无法获得位置。
这是对我有用的解决方案:
获取视图中-
当我添加 text watcher 监听器来编辑文本时,我还添加了以下行
edittext.setTag(R.id.position,位置)
在你的 afterTextChanged - 整数位置 = edittext.getTag(R.id.position)
给出正确的位号,您可以根据位号进行修改