簡體   English   中英

SearchView for RecyclerView不起作用

[英]SearchView for RecyclerView is not working

我想用RecyclerView實現SearchView。

我遵循了一些教程和一些答案,但是沒有一個對我有幫助。 這是我的活動。 我有一些僅需按名稱過濾的項目。

<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentStart="true"
android:background="#C4C4C9"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="2dp"
    android:paddingEnd="16dp">

    <SearchView
        android:id="@+id/search_bar"
        android:layout_width="300dp"
        android:layout_height="35dp"
        android:background="@drawable/border_radius"
        android:drawableLeft="@drawable/ic_search_black_24dp"
        android:hint="@string/search"
        android:inputType="textCapWords"
        android:textColorHint="@color/dark_gray"/>

    <Button
        android:layout_width="80dp"
        android:layout_height="35dp"
        android:background="@drawable/border_radius"
        android:backgroundTint="#C2C2C7"
        android:hint="Cancel"
        android:textSize="20sp"
        android:fontFamily="@font/roboto_black"
        style="?android:attr/borderlessButtonStyle" />

</LinearLayout>

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = findViewById(R.id.search_bar);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false);
    searchView.setActivated(true);
    searchView.setQueryHint("Kerko");
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            query = getClubs.getName().toLowerCase();
            clubsAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (searchView.getQuery().length() == 0) {
                clubsAdapter.getFilter().filter("");
            }
            return false;
        }
    });

ClubsAdapter clubsAdapter;
private ClubsData filteredClubs;

public ClubsFilter(ClubsAdapter clubsAdapter, ClubsData filteredClubs) {
    this.clubsAdapter = clubsAdapter;
    this.filteredClubs = filteredClubs;
}

@Override
protected FilterResults performFiltering(CharSequence constraint) {
    if(constraint != null && constraint.length() > 0) {
        constraint = constraint.toString().toLowerCase();
        ClubsData filteredClubs = new ClubsData();
        for(ClubsData clubsData : filteredClubs) {
            if(clubsData.getName().toLowerCase().contains(constraint)) {
                filteredClubs.getName();
            }
        }
    }
    FilterResults results = new FilterResults();
    results.values = filteredClubs;
    return results;
}

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    filteredClubs = (ClubsData) results.values;
    clubsAdapter.notifyDataSetChanged();
}

我創建了另一個僅用於過濾項目的適配器,但是我面臨着foreach循環的另一個問題:

foreach not applicable to type 'al.sqmo.model.ClubsData'

請嘗試這個

Your Adapter
 @Override
public Filter getFilter() {
    if (valueFilter == null) {
        valueFilter = new ValueFilter();
    }
    return valueFilter;
}

私有類ValueFilter擴展了Filter {

   @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults results = new FilterResults();


        if (constraint == null || constraint.length() == 0) {
            results.values = mainArrayList;
            results.count = mainArrayList.size();
        }
        else {

            ArrayList<Model> filteredExpenses = new ArrayList<Model>();


            for (Model requestModel : mainArrayList) {

                if (requestModel.getName().toLowerCase().contains( constraint.toString().toLowerCase()) || date.toLowerCase().contains(constraint.toString().toLowerCase()) ) {

                    filteredExpenses.add(requestModel);
                }

            }

            results.values = filteredExpenses;
            results.count = filteredExpenses.size();

        }


        return results;

    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mainArrayList = (ArrayList<Model>) results.values;
        notifyDataSetChanged();
        if(mainArrayList.isEmpty())
        {
            activity.findViewById(R.id.txt_no_result).setVisibility(View.VISIBLE);

        }
    }

}

問題出在這部分代碼中。

ClubsData filteredClubs = new ClubsData();
        for(ClubsData clubsData : filteredClubs) {
            if(clubsData.getName().toLowerCase().contains(constraint)) {
                filteredClubs.getName();
            }
        }

您嘗試循環ClubsData ,該方法應該實現Iterable接口,以便for each方法使用。 我認為您只是不知道要循環什么,在這種情況下,您需要插入throw Collection<ClubsData>

只需將過濾器替換為這樣的東西即可。

List<ClubsData> filteredClubs = getAdapterData()
        for(ClubsData clubsData : filteredClubs) {
            if(clubsData.getName().toLowerCase().contains(constraint)) {
               // Other code
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM