2015-09-09 94 views
0

我想添加一個搜索功能,過濾ListView並只顯示結果,所以我添加了一個EditText,我添加了它TextWatcher並編寫了此代碼MainActivity.this.adapter.getFilter().filter(cs);,但它不起作用它說「無法解析getFilter方法」和我確實知道BaseAdapter中沒有getFilter方法,但我不知道該怎麼做,或者我應該寫什麼,並且看到了一些教程,但是我無法使其與代碼一起工作。 PS:在ListView項目從不會被保存在應用程序代碼如何爲listview添加搜索欄?

這裏集在互聯網是MainActivity:

public class MainActivity extends Activity { 

private static final String TAG = MainActivity.class.getSimpleName(); 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 
private InterstitialAd interstitial; 

// Navigation drawer title 
private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private List<Category> albumsList; 
private ArrayList<NavDrawerItem> navDrawerItems; 
private NavDrawerListAdapter adapter; 
private LinearLayout DrawerLinear; 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.d("Test", "OnCreate Called"); 

    mTitle = mDrawerTitle = getTitle(); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 
    DrawerLinear = (LinearLayout) findViewById(R.id.DrawerLinear); 

    navDrawerItems = new ArrayList<NavDrawerItem>(); 

    // Getting the albums from shared preferences 
    albumsList = AppController.getInstance().getPrefManger().getCategories(); 

    // Insert "Recently Added" in navigation drawer first position 
    Category recentAlbum = new Category(null, 
      getString(R.string.nav_drawer_recently_added)); 

    albumsList.add(0, recentAlbum); 

    // Loop through albums in add them to navigation drawer adapter 
    for (Category a : albumsList) { 
     navDrawerItems.add(new NavDrawerItem(a.getId(), a.getTitle())); 
    } 

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

    // Setting the nav drawer list adapter 
    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    // Enabling action bar app icon and behaving it as toggle button 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 
    getActionBar().setIcon(
      new ColorDrawable(getResources().getColor(
        android.R.color.transparent))); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, R.string.app_name, R.string.app_name) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      // calling onPrepareOptionsMenu() to show action bar icons 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      // calling onPrepareOptionsMenu() to hide action bar icons 
      invalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     // on first time display view for first nav item 
     displayView(0); 
    } 

    final EditText inputSearch = (EditText) findViewById(R.id.inputSearch); 

    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 
      //You should use the adapter in NavigationDrawerFragment 
      MainActivity.this.adapter.getFilter().filter(cs); // Doesn't work, gives an error "Cannot resolve getFilter method" 

     } 

     @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 

     } 
    }); 

} 

,這裏是我的適配器:

public class NavDrawerListAdapter extends BaseAdapter{ 

private Context context; 
private ArrayList<NavDrawerItem> navDrawerItems; 

public NavDrawerListAdapter(Context context, 
     ArrayList<NavDrawerItem> navDrawerItems) { 
    this.context = context; 
    this.navDrawerItems = navDrawerItems; 
} 

@Override 
public int getCount() { 
    return navDrawerItems.size(); 
} 

@Override 
public Object getItem(int position) { 
    return navDrawerItems.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.drawer_list_item, null); 
    } 

    TextView txtTitle = (TextView) convertView.findViewById(R.id.title); 

    txtTitle.setText(navDrawerItems.get(position).getTitle()); 

    return convertView; 
} 
} 
+0

您的適配器沒有一個名爲getFilter()的方法..您需要實現 – Wicked161089

+0

ref http:// stackoverflow。com/questions/24769257/custom-listview-adapter-with-filter-android – arun

回答

3

你應該實現您的自定義適配器中的接口Filterable。它不是由BaseAdapter實現的。

編輯: 這是一個更完整的例子:

public class FiltarableAdapter extends BaseAdapter implements Filterable { 

    // keep the full data here. This is needed to not loose it while filtering 
    private List<SomeObject> originalData; 
    // keep the data you want to show to the user here 
    private List<SomeObject> data; 

    // skip adapter methods 

    // we will use an instance of this to perform the filtering 
    private class AdapterFilter implements Filter { 

     FilterResults performFiltering(CharSequence constraint) { 
      // use the constraint to filter your data in this method and create a list containing the result 
      List<SomeObject> filteredData = ... 
      FilterResults result = new FilterResults(); 
      result.count = filteredData.size(); 
      result.object = filteredData; 
     } 

     void publishResults(CharSequence constraint, Filter.FilterResults results) { 
      // here you get the search results and you should use them to update your UI 
      // for brevity of the example, we just replace the current adapter data with the result object 
      FilterableAdapter.this.data = results.object; 
      FilterableAdapter.this.notifyDataSetChanged(); 
     } 
    } 

    public Filter getFilter() { 
     return new AdapterFilter(); 
    } 
} 

基本上,你的電源適配器內部定義過濾器,並返回一個新的實例來調用getFilter()客戶端。在過濾器本身中,您需要在數據中進行搜索,並在有結果時將結果數據集與當前數據集進行交換。您還需要保留原始未經過濾的數據集,以便在清除過濾器後快速恢復列表。

希望這會有所幫助。

+0

那我該怎麼做? –

+0

我用一個僞代碼示例更新了我的答案 –

+0

什麼是'result.object'? –

0

首先,則應該從過濾的

公共類NavDrawerListAdapter延伸BaseAdapter實現的可篩選

實現你的適配器和覆蓋用getFilter方法:

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence searchText) { 
      //by searchText you should filter here 
      FilterResults result = new FilterResults(); 

      // here your filtering 
      // filling result 

      return result; 
     } 

     @Override 
     protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 

     // here your filterResults 
      clear(); 
      addAll(filterResults.values); 
      notifyDataSetChanged(); 
     } 
    }; 
} 

在活動聲明過濾對象

private Filter filter; 

中的onCreate初始化過濾器:

adapter = new NavDrawerListAdapter(getApplicationContext(), 
     navDrawerItems); 
// getting filter from adapter 
filter = adapter.getFilter(); 

,並在您onTextChanged:

@Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
     //You should use the adapter in NavigationDrawerFragment 
     filter.filter(cs); 
    } 

這就是所有:)

0

你可以爲了你的工具欄/動作條中添加搜索查看讓用戶搜索(過濾)列表視圖。這裏有一個例子(http://javapapers.com/android/android-searchview-action-bar-tutorial/)。 然後,您可以按照Danail Alexiev向您建議的方式使用可過濾適配器進行過濾,或者只需過濾適配器的來源並從外部更新適配器即可。