2013-03-12 107 views
0

我正在開發一個應用程序。在其中顯示數據來自SQLite數據庫的列表視圖。我在String []中獲取數據。搜索欄中的應用程序

現在需要的應用是:我想在活動頂部添加一個搜索欄。此搜索欄應僅在活動列表中顯示搜索。

當用戶在搜索欄中鍵入一個字母時,所有數據都應該以包含該字母的列表視圖顯示。

我試過下面的代碼。

在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); 

而且在適配器類:

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; 
     } 
    }; 
} 

我應該爲此做些什麼。數據在String []中。在列表視圖中顯示。

請建議我需要進行哪些更改。

當應用上面的代碼我和運行我的應用程序,並試圖尋找,我得到了錯誤爲:

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) 

回答

0

在列表視圖的頂部有一個editext。我建議你有一個自定義列表適配器。

有一個數據庫的原始值列表。

有另一個列表來設置臨時數據以符合搜索條件。

如果您的搜索條件與列表中的某個條件匹配,請將其添加到基礎列表中並在列表中顯示數據。如果它與列表中的顯示原始數據不匹配。

我已經給出了一個總體思路。下面的代碼可以根據您的需要進行修改。我自己實施了搜索,它起作用。

我在SO問了一個問題,我從How to implement search in CustomListView based on class item of POJO class in Android?得到了答案。

嘗試下面的內容,如果您無法使其正常工作,則可以隨時在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) { 
      } 
      }); 

列表

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; 
     } 
    }; 
} 

編輯1

how to set json parsed data in a listview and then adding search functionality in it上實現一個過濾器。鏈接中的答案是有效的。我使用了臨時數據並對其執行了搜索功能。您可以顯示數據表單數據庫並對其進行修改。

編輯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       
     } 
    }); 
    } 

} 

編輯3搜索的數據與來自數據庫

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()); 
     } 
    }); 
} 
}