Android的ListView的带过滤器的问题 [英] Android listview with filter issue
问题描述
我已经从数据库来的项目列表视图。现在,我已经把一个文本编辑在我的列表视图的顶部。我要的是,当用户开始在编辑文本输入,列表视图应过滤。例如,如果用户输入一个字母A,只有开头的A应该出现在列表中的名称。我在code使用的自定义适配器。我问这个问题很多次,但都没有找到一个解决办法。
这是我的数据列表活动code:
公共类DataListActivity延伸活动{ ListView控件的ListView;
SQLiteDatabase sqLiteDatabase;
FoodDbHelper foodDbHelper;
光标光标;
ListDataAdapter listDataAdapter;
私人按钮BUTTON1;
ListDataAdapter DataAdapter的= NULL;
Button按钮;
DataProvider的dataProvider中;
ArrayList的<&HashMap的LT;字符串,字符串>> namessList;
的EditText inputSearch;
串SEARCH_NAME;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
的setContentView(R.layout.data_list_layout);
inputSearch =(EditText上)findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(新TextWatcher(){ @覆盖
公共无效onTextChanged(CharSequence的CS,INT ARG1,ARG2 INT,INT ARG3){
//当用户更改文本
。listDataAdapter.getFilter()过滤器(CS);
} @覆盖
公共无效beforeTextChanged(CharSequence的为arg0,ARG1 INT,INT ARG2,
INT ARG3){
// TODO自动生成方法存根 } @覆盖
公共无效afterTextChanged(编辑为arg0){
// TODO自动生成方法存根
}
}); ListView控件=(ListView控件)findViewById(R.id.list_View); listDataAdapter =新ListDataAdapter(getApplicationContext()
R.layout.row_layout){ @覆盖
保护无效showCheckedButton(INT位置,布尔值){
// TODO自动生成方法存根 dataProvider项目=(DataProvider的)listDataAdapter
.getItem(位置);
Log.i(,); item.setSelected(值); 按钮则myButton =(按钮)findViewById(R.id.findSelected);
myButton.setOnClickListener(新View.OnClickListener(){ @覆盖
公共无效的onClick(视图v){ StringBuffer的responseText的=新的StringBuffer();
responseText的
.append(选择了下列菜... \\ n); ArrayList的<&DataProvider的GT;清单= listDataAdapter
.getSelectedIndexes(); INT总和= 0;
的for(int i = 0; I<则为list.size();我++){
的DataProvider的dataProvider = list.get(I) 总和=总和+ dataProvider.getCalorie(); responseText.append(\\ n+ dataProvider.getName()
+:+ dataProvider.getCalorie()
+大卡
); } Toast.makeText(getApplicationContext(),+ responseText的+\\ n+................................ 。
+\\ n+总热量在您的菜单是:+总和,
Toast.LENGTH_LONG).show();
}
});
}
};
listView.setAdapter(listDataAdapter);
foodDbHelper =新FoodDbHelper(getApplicationContext());
sqLiteDatabase = foodDbHelper.getReadableDatabase();
光标= foodDbHelper.getInformations(sqLiteDatabase);
如果(cursor.moveToFirst()){
做{
字符串名称,数量,脂肪,蛋白质,糖,维生素;
布尔选择= FALSE;
字符串名称= NULL;
整数热量; 名称= cursor.getString(0);
量= cursor.getString(1);
热量= Integer.valueOf(cursor.getString(2));
脂肪= cursor.getString(3);
蛋白质= cursor.getString(4);
糖= cursor.getString(5);
维生素= cursor.getString(6); DataProvider的dataProvider中=新的DataProvider(名称,数量,
热量,脂肪,蛋白质,糖,维生素,姓名,选择的); listDataAdapter.add(dataProvider中); }而(cursor.moveToNext());
} listView.setOnItemClickListener(新AdapterView.OnItemClickListener(){
@覆盖
公共无效onItemClick(适配器视图<>母公司,观景,
INT位置,长的id){ 字符串名称=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_name))的getText()。
串数量=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_quantity))的getText()。
字符串热量=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_calorie))的getText()。
字符串脂肪=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_fat))的getText()。
串蛋白=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_protein))的getText()。
串糖=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_sugar))的getText()。
字符串维生素=(字符串)((的TextView)查看
.findViewById(R.id.text_dish_vitamins))的getText()。 将String.valueOf(parent.getItemAtPosition(位置)); Toast.makeText(getApplicationContext(),
这道菜的名字是:+姓名,Toast.LENGTH_SHORT).show(); 意向意图=新意图(getApplicationContext()
Detail.class);
intent.putExtra(菜名,名);
intent.putExtra(菜量,数量);
intent.putExtra(菜卡路里,热量);
intent.putExtra(菜胖,脂肪);
intent.putExtra(盘蛋白质,蛋白质);
intent.putExtra(盘糖,糖); intent.putExtra(这道菜维生素,维生素); startActivity(意向);
} });
} 公共无效gobackk(查看视图){
意向意图=新意图(这一点,MainMenu.class);
startActivity(意向);
}
你可以在你的XML使用搜索查看?如果再在这里不是问题,你有完整的工作code。与适配器和XML的一切!
XML
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =match_parent
机器人:layout_height =match_parent
工具:上下文=MyActivity。><搜索查看
机器人:ID =@ + ID / searchPlayers
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
机器人:layout_alignParentLeft =真
机器人:layout_alignParentStart =真
机器人:背景=@彩色/ Blue600
机器人:layout_alignParentTop =真/>< ListView控件
机器人:ID =@ + ID / playersList
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:layout_below =@ + ID / searchPlayers
机器人:分=@彩色/蒂尔
机器人:dividerHeight =1DP
机器人:scrollingCache =假
机器人:smoothScrollbar =真/>
让您的mainActivity 扩展活动实现SearchView.OnQueryTextListener,可筛选,SearchView.OnCloseListener
里面MainActivity的的onCreate():
搜索查看=(搜索查看)findViewById(R.id.searchPlayers); searchView.setOnQueryTextListener(本);
searchView.setOnCloseListener(本);
searchView.setQueryHint(由播放器搜索);
在你MainActivity覆盖这些:
@覆盖
公共布尔onQueryTextChange(字符串newText){名单将得到过滤,按输入。
如果(TextUtils.isEmpty(newText)){
listView.clearTextFilter();
。customAdapter.getFilter()过滤();
}其他{
如果(customAdapter!= NULL){
PlayersCustomAdapter CA =(PlayersCustomAdapter)listView.getAdapter();
。ca.getFilter()过滤器(newText);
}
}
返回true;
}@覆盖
公共布尔onQueryTextSubmit(字符串ABC){
返回false;
}@覆盖
公共android.widget.Filter用getFilter(){
返回null;
}@覆盖
公共布尔的OnClose(){//将列表设置为初始位置时,搜索查看被关闭
。customAdapter.getFilter()过滤();
返回false;
}
下面是自定义适配器..!
公共类PlayersCustomAdapter扩展BaseAdapter实现过滤的{
上下文语境;
ArrayList的< PlayersMapper> playersMapperList,filteredplayersMapperList;公共PlayersCustomAdapter(上下文的背景下,ArrayList的< PlayersMapper>名单){
超();
// PlayersMapper是模型〜映射器类,这里我有我从我的Web服务让所有的意见。
this.context =背景;
this.playersMapperList =清单;
}公共PlayersCustomAdapter(){}
类ViewHolder {
保护的TextView tvPlayerName;
保护的TextView tvTeamName;
保护的TextView tvNationality;
保护ImageView的ivPlayerPic;
}@覆盖
公共过滤用getFilter(){
返回新过滤器(){ @覆盖
保护FilterResults performFiltering(CharSequence的约束){
最后FilterResults filteringResult =新FilterResults();
最终的ArrayList< PlayersMapper> filterdResult =新的ArrayList< PlayersMapper>(); 如果(filteredplayersMapperList == NULL)
filteredplayersMapperList =新的ArrayList< PlayersMapper>(playersMapperList);
如果(约束!= NULL){
如果(filteredplayersMapperList!= NULL
&功放;&安培; filteredplayersMapperList.size()> 0){ 对于(最终PlayersMapper pmObj:filteredplayersMapperList){
如果(pmObj.PlayerName.contains(constraint.toString()))
filterdResult.add(pmObj);
}
}
filteringResult.values = filterdResult;
filteringResult.count = filterdResult.size();
}
返回filteringResult;
} @燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,
FilterResults结果){ 如果(results.count == 0){
notifyDataSetInvalidated();
}其他{
playersMapperList =(ArrayList的< PlayersMapper>)results.values;
notifyDataSetChanged();
} } };
}公共无效notifyDataSetChanged(){
super.notifyDataSetChanged();
}@覆盖
公众诠释的getCount(){ 返回playersMapperList.size();
}@覆盖
公共对象的getItem(INT位置){ 返回playersMapperList.get(位置);
}@覆盖
众长getItemId(INT POS){
返回POS;
}@覆盖
公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
查看查看= NULL;
LayoutInflater充气=((活动)上下文).getLayoutInflater();
鉴于= inflator.inflate(R.layout.players_item,NULL); 最后ViewHolder viewHolder =新ViewHolder(); viewHolder.tvPlayerName =(TextView的)查看
.findViewById(R.id.txtViewPlayerName);
viewHolder.tvTeamName =(TextView的)查看
.findViewById(R.id.txtViewTeamName);
viewHolder.tvNationality =(TextView的)查看
.findViewById(R.id.txtViewCountryName);
viewHolder.ivPlayerPic =(ImageView的)查看
.findViewById(R.id.imgViewPlayers); view.setTag(viewHolder); ViewHolder支架=(ViewHolder)view.getTag();
holder.tvPlayerName.setText(playersMapperList.get(位置).PlayerName);
holder.tvTeamName.setText(playersMapperList.get(位置).TeamName);
holder.tvNationality
.setText(playersMapperList.get(位置).Nationality);
返回视图。
}}
I have a listview of items coming from a database. Now I have put an edit text at the top of my listview. What I want is that when a user start typing in the edit text, the listview should be filtered. For example, if the user enters a letter "A", only the names starting with an "A" should appear in the list. I have used a custom adapter in my code. I asked this question many times, but haven't found a solution yet.
This is my data list activity code:
public class DataListActivity extends Activity {
ListView listView;
SQLiteDatabase sqLiteDatabase;
FoodDbHelper foodDbHelper;
Cursor cursor;
ListDataAdapter listDataAdapter;
private Button button1;
ListDataAdapter dataAdapter = null;
Button button;
DataProvider dataProvider;
ArrayList<HashMap<String, String>> namessList;
EditText inputSearch;
String search_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.data_list_layout);
inputSearch = (EditText)findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changes the Text
listDataAdapter.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
}
});
listView = (ListView) findViewById(R.id.list_View);
listDataAdapter = new ListDataAdapter(getApplicationContext(),
R.layout.row_layout) {
@Override
protected void showCheckedButton(int position, boolean value) {
// TODO Auto-generated method stub
DataProvider item = (DataProvider) listDataAdapter
.getItem(position);
Log.i("", "");
item.setSelected(value);
Button myButton = (Button) findViewById(R.id.findSelected);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StringBuffer responseText = new StringBuffer();
responseText
.append("The following dishes were selected...\n");
ArrayList<DataProvider> list = listDataAdapter
.getSelectedIndexes();
int sum = 0;
for (int i = 0; i < list.size(); i++) {
DataProvider dataProvider = list.get(i);
sum = sum + dataProvider.getCalorie();
responseText.append("\n" + dataProvider.getName()
+ " : " + dataProvider.getCalorie()
+ " kcal"
);
}
Toast.makeText(getApplicationContext(), ""+responseText+"\n"+"................................."
+"\n"+"Total Calories In Your Menu Is : " +sum,
Toast.LENGTH_LONG).show();
}
});
}
};
listView.setAdapter(listDataAdapter);
foodDbHelper = new FoodDbHelper(getApplicationContext());
sqLiteDatabase = foodDbHelper.getReadableDatabase();
cursor = foodDbHelper.getInformations(sqLiteDatabase);
if (cursor.moveToFirst()) {
do {
String name, quantity, fat, protein, sugar, vitamins;
boolean selected = false;
String names = null;
Integer calorie;
name = cursor.getString(0);
quantity = cursor.getString(1);
calorie = Integer.valueOf(cursor.getString(2));
fat = cursor.getString(3);
protein = cursor.getString(4);
sugar = cursor.getString(5);
vitamins = cursor.getString(6);
DataProvider dataProvider = new DataProvider(name, quantity,
calorie, fat, protein, sugar, vitamins, names, selected);
listDataAdapter.add(dataProvider);
} while (cursor.moveToNext());
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String name = (String) ((TextView) view
.findViewById(R.id.text_dish_name)).getText();
String quantity = (String) ((TextView) view
.findViewById(R.id.text_dish_quantity)).getText();
String calorie = (String) ((TextView) view
.findViewById(R.id.text_dish_calorie)).getText();
String fat = (String) ((TextView) view
.findViewById(R.id.text_dish_fat)).getText();
String protein = (String) ((TextView) view
.findViewById(R.id.text_dish_protein)).getText();
String sugar = (String) ((TextView) view
.findViewById(R.id.text_dish_sugar)).getText();
String vitamins = (String) ((TextView) view
.findViewById(R.id.text_dish_vitamins)).getText();
String.valueOf(parent.getItemAtPosition(position));
Toast.makeText(getApplicationContext(),
"dish name is : " + name, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getApplicationContext(),
Detail.class);
intent.putExtra("Dish name", name);
intent.putExtra("Dish quantity", quantity);
intent.putExtra("Dish calorie", calorie);
intent.putExtra("Dish fat", fat);
intent.putExtra("Dish protein", protein);
intent.putExtra("Dish sugar", sugar);
intent.putExtra("Dish vitamins", vitamins);
startActivity(intent);
}
});
}
public void gobackk(View view) {
Intent intent = new Intent(this, MainMenu.class);
startActivity(intent);
}
Instead of EditText can you use SearchView in your Xml?? If that's not problem then here you have complete working code with adapter and xml everything.!
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity" >
<SearchView
android:id="@+id/searchPlayers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/Blue600"
android:layout_alignParentTop="true" />
<ListView
android:id="@+id/playersList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/searchPlayers"
android:divider="@color/Teal"
android:dividerHeight="1dp"
android:scrollingCache="false"
android:smoothScrollbar="true" />
Let your mainActivity extends Activity implements SearchView.OnQueryTextListener, Filterable,SearchView.OnCloseListener
Inside onCreate() of MainActivity:
searchView = (SearchView) findViewById(R.id.searchPlayers);
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(this);
searchView.setQueryHint("Search by Player");
Override these in you MainActivity:
@Override
public boolean onQueryTextChange(String newText) {list will get filtered as per input.
if (TextUtils.isEmpty(newText)) {
listView.clearTextFilter();
customAdapter.getFilter().filter("");
} else {
if(customAdapter!=null){
PlayersCustomAdapter ca = (PlayersCustomAdapter) listView.getAdapter();
ca.getFilter().filter(newText);
}
}
return true;
}
@Override
public boolean onQueryTextSubmit(String abc) {
return false;
}
@Override
public android.widget.Filter getFilter() {
return null;
}
@Override
public boolean onClose() {//it will set the list to initial position when searchView is closed
customAdapter.getFilter().filter("");
return false;
}
Here is the Custom Adapter..!
public class PlayersCustomAdapter extends BaseAdapter implements Filterable {
Context context;
ArrayList<PlayersMapper> playersMapperList, filteredplayersMapperList;
public PlayersCustomAdapter(Context context, ArrayList<PlayersMapper> list) {
super();
//PlayersMapper is the model~mapper class, where i have all views which i am getting from my web service.
this.context = context;
this.playersMapperList = list;
}
public PlayersCustomAdapter(){
}
class ViewHolder {
protected TextView tvPlayerName;
protected TextView tvTeamName;
protected TextView tvNationality;
protected ImageView ivPlayerPic;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults filteringResult = new FilterResults();
final ArrayList<PlayersMapper> filterdResult = new ArrayList<PlayersMapper>();
if (filteredplayersMapperList == null)
filteredplayersMapperList = new ArrayList<PlayersMapper>(playersMapperList);
if (constraint != null) {
if (filteredplayersMapperList != null
&& filteredplayersMapperList.size() > 0) {
for (final PlayersMapper pmObj : filteredplayersMapperList) {
if (pmObj.PlayerName.contains(constraint.toString()))
filterdResult.add(pmObj);
}
}
filteringResult.values = filterdResult;
filteringResult.count = filterdResult.size();
}
return filteringResult;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results.count == 0) {
notifyDataSetInvalidated();
} else {
playersMapperList = (ArrayList<PlayersMapper>) results.values;
notifyDataSetChanged();
}
}
};
}
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return playersMapperList.size();
}
@Override
public Object getItem(int position) {
return playersMapperList.get(position);
}
@Override
public long getItemId(int pos) {
return pos;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
LayoutInflater inflator = ((Activity) context).getLayoutInflater();
view = inflator.inflate(R.layout.players_item, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.tvPlayerName = (TextView) view
.findViewById(R.id.txtViewPlayerName);
viewHolder.tvTeamName = (TextView) view
.findViewById(R.id.txtViewTeamName);
viewHolder.tvNationality = (TextView) view
.findViewById(R.id.txtViewCountryName);
viewHolder.ivPlayerPic = (ImageView) view
.findViewById(R.id.imgViewPlayers);
view.setTag(viewHolder);
ViewHolder holder = (ViewHolder) view.getTag();
holder.tvPlayerName.setText(playersMapperList.get(position).PlayerName);
holder.tvTeamName.setText(playersMapperList.get(position).TeamName);
holder.tvNationality
.setText(playersMapperList.get(position).Nationality);
return view;
}
}
这篇关于Android的ListView的带过滤器的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!