搜索栏应用 [英] Search Bar in application

查看:141
本文介绍了搜索栏应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发的应用程序。在其中一个列表视图显示在其中的数据被从SQLite的数据的基础上的到来。我在的String []获取数据。

现在应用程序的需求是:我想在活动上添加一个搜索栏。这个搜索栏应该只显示在活动列表中执行搜索。

当用户在搜索栏中键入一个字母的所有数据应该显示谁是包含字母列表视图。

我尝试以下code。

在main.java

  EditText上搜索=(EditText上)findViewById(R.id.edittext_searchbar);
sea​​rch.addTextChangedListener(新TextWatcher(){
    公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
    。adapter.getFilter()过滤器(S);
        adapter.notifyDataSetChanged();
    }
    公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
    }
    @覆盖
    公共无效afterTextChanged(编辑S){
    }
    });
listView.setAdapter(适配器);

和适配器类:

 公共无效使用setData(字符串[]菜单列表){
    menuListofAdapter =菜单列表; //包含类项目的数据。
}@覆盖
公共过滤用getFilter(){
    返回新过滤器(){
    @覆盖
    保护无效publishResults(CharSequence的约束,FilterResults结果){
        如果(结果= NULL&放大器;!&安培; results.count> = 0){
        使用setData((字符串[])results.values​​); //如果搜索结果是空集搜索到的结果数据
    }其他{
                使用setData(menu​​ListofAdapter); //设置初始值
            }
            notifyDataSetInvalidated();
        }        @燮pressWarnings(空)
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束){
            FilterResults结果=新FilterResults();
            如果(!TextUtils.isEmpty(约束)){
                约束= constraint.toString();
                的String [] fItem = NULL;
                如果(Utility.mainMenuList!= NULL){
                    的for(int i = 0,J = 0; I< Utility.mainMenuList.length;我++){
                    如果(Utility.mainMenuList [I] .equalsIgnoreCase(constraint.toString())){
                             fItem [J] = Utility.mainMenuList [I]
                         当J = J + 1;
                     }其他{
                     }
                 }
             }
             result.count = fItem.length;
             result.values​​ = fItem;
         }其他{
             result.count = -1; //没有找到搜索结果
         }
         返回结果;
        }
     };
 }

我应该为此做些什么。这些数据是在的String []。显示在列表视图中。

请建议我需要什么样的变化。

在上面的应用code I和运行我的应用程序,并试图寻找,我得到了错误的:

  03-12 18:16:19.215:D / AndroidRuntime(836):关闭VM
03-12 18:16:19.215:W / dalvikvm(836):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
03-12 18:16:19.215:E / AndroidRuntime(836):致命异常:主要
03-12 18:16:19.215:E / AndroidRuntime(836):java.lang.ClassCastException:java.util.ArrayList中
03-12 18:16:19.215:E / AndroidRuntime(836):在com.abc.example.adapters.MyListAdapter $ 1.publishResults(MainMenuListAdapter.java:41)
03-12 18:16:19.215:E / AndroidRuntime(836):在android.widget.Filter $ ResultsHandler.handleMessage(Filter.java:282)
03-12 18:16:19.215:E / AndroidRuntime(836):在android.os.Handler.dispatchMessage(Handler.java:99)
03-12 18:16:19.215:E / AndroidRuntime(836):在android.os.Looper.loop(Looper.java:123)
03-12 18:16:19.215:E / AndroidRuntime(836):在android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 18:16:19.215:E / AndroidRuntime(836):在java.lang.reflect.Method.invokeNative(本机方法)
03-12 18:16:19.215:E / AndroidRuntime(836):在java.lang.reflect.Method.invoke(Method.java:507)
03-12 18:16:19.215:E / AndroidRuntime(836):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 18:16:19.215:E / AndroidRuntime(836):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 18:16:19.215:E / AndroidRuntime(836):在dalvik.system.NativeStart.main(本机方法)


解决方案

有你的列表视图顶部的editext。我建议你​​有一个自定义列表适配器。

拥有原始值的列表数据库。

有另一个列表中设置的临时数据,以符合搜索条件。

如果您的搜索条件匹配一个列表中的那些在列表中添加到founditmes和显示数据。如果它不匹配列表中的显示原始数据

我已经给了一个大致的了解。下面code可以根据自己的需要进行修改。我已经实现了自己的搜索和它的作品。

我问一个问题,在SO和我从答案<一个href=\"http://stackoverflow.com/questions/13090046/how-to-implement-search-in-customlistview-based-on-class-item-of-pojo-class-in-a\">How基于Android中POJO类的类项目实施CustomListView搜索?。

试试下面的,如果你不能够得到它的工作,你总是可以在SO发布问题。

 搜索=(EditText上)findViewById(R.id.search);
     //寻找在文字的EditText变化。
     sea​​rch.addTextChangedListener(新TextWatcher(){         公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                         。youradapter.getFilter()过滤器(S);
                         youradapter.notifyDataSetChanged();         }         公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
             INT后){
           }           公共无效afterTextChanged(编辑S){
           }
          });

清单上实现一个过滤器

 公共无效使用setData(ArrayList的mPpst){
         一组数据或者搜索到的数据或从数据库原始值
        mPostingData = mPpst; //包含类项目的数据。
    } @覆盖
 公共过滤用getFilter(){
     返回新过滤器(){
         @覆盖
         保护无效publishResults(CharSequence的约束,FilterResults结果){
             如果(结果= NULL&放大器;!&安培; results.count&GT; = 0){
                 使用setData(results.values​​); //如果结果符合设定的数据
             }其他{
                 使用setData(MORI);对于ListView的原始值//数据集。
             }             notifyDataSetInvalidated();
         }        @覆盖
         保护FilterResults performFiltering(CharSequence的约束){
             FilterResults结果=新FilterResults();
             如果(!TextUtils.isEmpty(约束)){
                   ArrayList的foundItems =新的ArrayList();
                 约束= constraint.toString()与toLowerCase()。
                 如果(listItems中!= NULL)
                 {
                         如果(listitems.equals(constarint))//匹配
                         foundItems.add(listItems中);                     }
                     其他
                     {                     }
                 }
                 }
                 result.count = foundItems.size(); //搜索结果中返回计数
                 result.values​​ = foundItems; //返回值
             }
             其他
             {
                 result.count = -1; //没有找到搜索结果
             }
             返回结果;
         }
     };
 }

编辑1

<一个href=\"http://stackoverflow.com/questions/15109406/how-to-set-json-parsed-data-in-a-listview-and-then-adding-search-functionality-i/15109592#15109592\">how设置JSON解析在ListView数据,然后添加搜索功能在它的。在链接的答案的作品。我已经使用的临时数据,并在其上​​做了搜索功能。您可以显示数据形式的数据库并修改相同的。

编辑2:

 公共类MainActivity延伸活动{// 列表显示
私人的ListView LV;//列表视图适配器
ArrayAdapter&LT;串GT;适配器;//搜索的EditText
的EditText inputSearch;
// ArrayList的列表视图为
ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT; productList的;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);    //列表视图数据
    字符串产品[] = {AAA,BBBB,CCCC,DDDD};    LV =(ListView控件)findViewById(R.id.list_view);
    inputSearch =(EditText上)findViewById(R.id.inputSearch);    //添加项目列表视图
    适配器=新ArrayAdapter&LT;串GT;(这一点,R.layout.list_item,R.id.product_name,产品);
    lv.setAdapter(适配器);    / **
     *启用搜索过滤器
     * * /
    inputSearch.addTextChangedListener(新TextWatcher(){        @覆盖
        公共无效onTextChanged(CharSequence的CS,INT ARG1,ARG2 INT,INT ARG3){
            //当用户更改文本
            。MainActivity.this.adapter.getFilter()过滤器(CS);
        }        @覆盖
        公共无效beforeTextChanged(CharSequence的为arg0,ARG1 INT,INT ARG2,
                INT ARG3){
            // TODO自动生成方法存根        }        @覆盖
        公共无效afterTextChanged(编辑为arg0){
            // TODO自动生成方法存根
        }
    });
  }}

编辑3搜寻与数据库中的数据

 公共类SearchActivity扩展ListActivity {
 ArrayAdapter&LT;串GT; DataAdapter的= NULL;  私人的ArrayList&LT;串GT;结果=新的ArrayList&LT;串GT;();
  私有String tableName值= DatabaseHandler.TABLE_SEARCH;
  私人SQLiteDatabase NEWDB;
  ArrayAdapter&LT;串GT;适配器= NULL;  @覆盖
  公共无效的onCreate(捆绑savedInstanceState){
  super.onCreate(savedInstanceState);
  的setContentView(R.layout.page_search);   数据库处理器dbHelper =新数据库处理器(this.getApplicationContext());
   NEWDB = dbHelper.getWritableDatabase();
   光标C = newDB.rawQuery(SELECT FROM skeys+
        tableName值,NULL);
   如果(C!= NULL){
    如果(c.moveToFirst()){
        做{
            串skeys = c.getString(c.getColumnIndex(skeys));
            results.add(skeys);
        }而(c.moveToNext());
    }
 }DataAdapter的=新ArrayAdapter&LT;串GT;(这一点,
        R.layout.listviews_search,结果);setListAdapter(新ArrayAdapter&LT;串GT;(这一点,
        R.layout.listviews_search,结果));  ListView控件的ListView =(ListView控件)findViewById(android.R.id.list);
  listView.setAdapter(DataAdapter的);
  listView.setTextFilterEnabled(真);  listView.setOnItemClickListener(新OnItemClickListener(){
      公共无效onItemClick(适配器视图&LT;&GT;母公司,观景,
              INT位置,长的id){
          Toast.makeText(getApplicationContext(),
                  )((的TextView)视图).getText(),Toast.LENGTH_SHORT).show(;
      }
  });  的EditText myFilter =(EditText上)findViewById(R.id.search);
  myFilter.addTextChangedListener(新TextWatcher(){
      公共无效afterTextChanged(编辑S){
  }      公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
  }      公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
   。dataAdapter.getFilter()过滤(s.toString());
      }
  });
 }
}

I am developing an application. In which a list view is displayed in which the data is coming from SQLite data base. I am getting data in String[].

Now the need of application is that : I want to add a search bar in top of the activity. This search bar should perform search only on the list showing on the activity.

When user type a letter in search bar all the data should display in list view who is containing that letter.

I tried the following code.

In main.java

EditText search= (EditText) findViewById(R.id.edittext_searchbar);
search.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s);
        adapter.notifyDataSetChanged();
    }   
    public void beforeTextChanged(CharSequence s, int start, int count,int after) {
    }
    @Override
    public void afterTextChanged(Editable s) {
    }
    });
listView.setAdapter(adapter);

And in Adapter class :

public void setData(String[] menuList) {   
    menuListofAdapter = menuList;//contains class items data.
}

@Override
public Filter getFilter() {
    return new Filter() {
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        if (results != null && results.count >= 0) {
        setData((String[]) results.values);//if results of search is null set the searched results data
    } else {
                setData(menuListofAdapter);// set original values
            }
            notifyDataSetInvalidated();
        }

        @SuppressWarnings("null")
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            if (!TextUtils.isEmpty(constraint)) {
                constraint = constraint.toString();
                String[] fItem = null;
                if(Utility.mainMenuList!=null){
                    for(int i=0,j=0;i<Utility.mainMenuList.length;i++){
                    if (Utility.mainMenuList[i].equalsIgnoreCase(constraint.toString())) {
                             fItem[j] = Utility.mainMenuList[i];
                         j=j+1;
                     }else{
                     }
                 }
             }
             result.count = fItem.length;
             result.values = fItem;
         } else{
             result.count=-1;// no search results found
         }             
         return result;
        }
     };
 }

What should i do for this. The data is in String[]. Display in list view.

Please suggest me what changes are required.

When i applied above code and run my app and tried to search, I got error as :

03-12 18:16:19.215: D/AndroidRuntime(836): Shutting down VM
03-12 18:16:19.215: W/dalvikvm(836): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-12 18:16:19.215: E/AndroidRuntime(836): FATAL EXCEPTION: main
03-12 18:16:19.215: E/AndroidRuntime(836): java.lang.ClassCastException: java.util.ArrayList
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.abc.example.adapters.MyListAdapter$1.publishResults(MainMenuListAdapter.java:41)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.os.Looper.loop(Looper.java:123)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 18:16:19.215: E/AndroidRuntime(836):  at java.lang.reflect.Method.invokeNative(Native Method)
03-12 18:16:19.215: E/AndroidRuntime(836):  at java.lang.reflect.Method.invoke(Method.java:507)
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 18:16:19.215: E/AndroidRuntime(836):  at dalvik.system.NativeStart.main(Native Method)

解决方案

Have a editext at the top of your listview. I suggest you to have a custom list adapter.

Have a list of original values for database.

Have another list to set temporary data to match the search criteria.

If your search criteria matches one in the list add those to founditmes and display the data in the list. If it does not match display original data in the list.

I have given a general idea. The below code can be modified according to your needs. I have implemented the search myself and it works.

I asked a question in SO and i got the answer from How to implement search in CustomListView based on class item of POJO class in Android?.

Try the below and if you are not able to get it working you can always post a question in SO.

     search= (EditText) findViewById(R.id.search);
     //look for text changing in edittext.
     search.addTextChangedListener(new TextWatcher() {

         public void onTextChanged(CharSequence s, int start, int before, int count) {
                         youradapter.getFilter().filter(s);
                         youradapter.notifyDataSetChanged();

         }

         public void beforeTextChanged(CharSequence s, int start, int count,
             int after) {


           }

           public void afterTextChanged(Editable s) {
           }
          });

Implement a filter on your list

 public void setData(ArrayList mPpst) {   
         set data either searched data or original values from database
        mPostingData = mPpst;//contains class items data.
    }

 @Override
 public Filter getFilter() {
     return new Filter() {
         @Override
         protected void publishResults(CharSequence constraint, FilterResults results) {
             if (results != null && results.count >= 0) {
                 setData( results.values);//if results match set data
             } else {
                 setData(mOri);// set data for listview original values.
             }

             notifyDataSetInvalidated();
         }



        @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults result = new FilterResults();
             if (!TextUtils.isEmpty(constraint)) {
                   ArrayList foundItems = new ArrayList();
                 constraint = constraint.toString().toLowerCase();
                 if(listitems!=null)
                 {
                         if(listitems.equals(constarint))//matching
                         foundItems.add(listitems);

                     }
                     else
                     {

                     }
                 }
                 }
                 result.count = foundItems.size();//search results found return count
                 result.values = foundItems;// return values
             } 
             else
             {
                 result.count=-1;// no search results found
             }


             return result;
         }
     };
 }

Edit 1

how to set json parsed data in a listview and then adding search functionality in it. The answer in the link works. I have used temporary data and did a search function on it. You can display data form database and modify the same.

Edit 2:

 public class MainActivity extends Activity {

// List view
private ListView lv;

// Listview Adapter
ArrayAdapter<String> adapter;

// Search EditText
EditText inputSearch;


// ArrayList for Listview
ArrayList<HashMap<String, String>> productList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Listview Data
    String products[] = {"aaa","bbbb","cccc","dddd"};

    lv = (ListView) findViewById(R.id.list_view);
    inputSearch = (EditText) findViewById(R.id.inputSearch);

    // Adding items to listview
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
    lv.setAdapter(adapter);

    /**
     * Enabling Search Filter
     * */
    inputSearch.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                          
        }
    });
  }

}

Edit 3 Search with data from Database

 public class SearchActivity extends ListActivity {
 ArrayAdapter<String> dataAdapter = null;

  private ArrayList<String> results = new ArrayList<String>();
  private String tableName = DatabaseHandler.TABLE_SEARCH;
  private SQLiteDatabase newDB;
  ArrayAdapter<String> adapter = null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.page_search);

   DatabaseHandler dbHelper = new DatabaseHandler(this.getApplicationContext());
   newDB = dbHelper.getWritableDatabase();
   Cursor c = newDB.rawQuery("SELECT skeys FROM " +
        tableName, null);
   if (c != null ) {
    if  (c.moveToFirst()) {
        do {
            String skeys = c.getString(c.getColumnIndex("skeys"));
            results.add(skeys);
        }while (c.moveToNext());
    } 
 }           

dataAdapter = new ArrayAdapter<String>(this,
        R.layout.listviews_search, results);

setListAdapter(new ArrayAdapter<String>(this,
        R.layout.listviews_search, results));

  ListView listView = (ListView) findViewById(android.R.id.list);
  listView.setAdapter(dataAdapter);
  listView.setTextFilterEnabled(true);

  listView.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
          Toast.makeText(getApplicationContext(),
                  ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
      }
  });

  EditText myFilter = (EditText) findViewById(R.id.search);
  myFilter.addTextChangedListener(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) {
   dataAdapter.getFilter().filter(s.toString());
      }
  });
 }
}

这篇关于搜索栏应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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