Android的ListView的带过滤器的问题 [英] Android listview with filter issue

查看:199
本文介绍了Android的ListView的带过滤器的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经从数据库来的项目列表视图。现在,我已经把一个文本编辑在我的列表视图的顶部。我要的是,当用户开始在编辑文本输入,列表视图应过滤。例如,如果用户输入一个字母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(意向);
    }


解决方案
相反的EditText的

你可以在你的XML使用搜索查看?如果再在这里不是问题,你有完整的工作code。与适配器和XML的一切!

XML

 <的RelativeLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人: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);    sea​​rchView.setOnQueryTextListener(本);
    sea​​rchView.setOnCloseListener(本);
    sea​​rchView.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆