Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Cách để filter RecyclerView với SearchView ạ ??
Em có cái Adapter thế này ạ
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class RcvDataAdapter_Player extends RecyclerView.Adapter<RcvDataAdapter_Player.RcvDataHolder_pl> {
ArrayList<ChampModel> champ = new ArrayList();
ArrayList<ChampModel> backup_champ = new ArrayList();
Context context;
public RcvDataAdapter_Player(Context context,ArrayList<ChampModel> champ){
this.champ =champ;
this.context = context;
this.backup_champ.addAll(this.champ);
Log.e("SIZE",String.valueOf(backup_champ.size()));
}
public void Filter(String champ_name)
{
champ.clear();
if(champ_name.isEmpty())
{
champ.addAll(backup_champ);
}
else {
champ_name = champ_name.toLowerCase();
for(ChampModel item : backup_champ)
{
if(item.getName().toLowerCase().contains(champ_name))
{
champ.add(item);
this.notifyDataSetChanged();
}
}
}
this.notifyDataSetChanged();
}
public void Reset ()
{
champ.addAll(backup_champ);
notifyDataSetChanged();
}
@Override
public RcvDataHolder_pl onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_champ,parent,false);
return new RcvDataHolder_pl(view);
}
@Override
public void onBindViewHolder(RcvDataHolder_pl holder, int position) {
holder.tvchamp.setText(champ.get(position).getName());
}
@Override
public int getItemCount() {
return champ == null ? 0 : champ.size();
}
public class RcvDataHolder_pl extends RecyclerView.ViewHolder{
TextView tvchamp;
public RcvDataHolder_pl(View itemView) {
super(itemView);
tvchamp = (TextView) itemView.findViewById(R.id.text_view_champ);
}
}
}
Em có 1 Fragment chứa RecyclerView và cái SearchView như thế này :
public class Fragment_player extends Fragment {
RecyclerView rcvPlayer;
SearchView srvPlayer;
View view;
RcvDataAdapter_Player adapter_player;
private static ArrayList<ChampModel> champList = new ArrayList();
public static void setChamp(ArrayList<ChampModel> list)
{
champList.addAll(list);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_pl,container,false);
adapter_player = new RcvDataAdapter_Player(this.getContext(),champList);
rcvPlayer = (RecyclerView) view.findViewById(R.id.recyclerview_player);
rcvPlayer.setLayoutManager(new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL,false));
rcvPlayer.setHasFixedSize(true);
rcvPlayer.setAdapter(adapter_player);
srvPlayer = (SearchView) view.findViewById(R.id.searchview_player);
srvPlayer.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
adapter_player.Filter(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter_player.Filter(newText);
return true;
}
});
srvPlayer.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
adapter_player.Reset();
return false;
}
});
return view;
}
}
Cái Array List thì em sẽ set bên MainActivity ạ. Trong cái Adapter em có cái hàm lọc từ cái String rồi kết thúc hàm thì nó gọi NotifyDataSetChanged(). Rồi em gọi cái hàm lọc để bên OnQueryTextChanged bên fragment để khi nó thay đổi chữ bên đó thì nó sẽ lọc.
Cơ mà nó vẫn không lọc được, ghi chữ gì lên nó xóa hêt cái RecyclerView. Em tìm kiếm trên mạng quài mà vẫn không biết cách xử lý làm sao. Em đang tính bỏ SearchView xong chuyển qua EditText nào đó mà không biết có khác gì nhau không ??
Bạn có thể làm như sau (dùng để lọc data cho fragment chứa recyclerview, bạn có thể dùng ý tưởng này để dùng cho trường hợp của bạn). Đây là cách mình hay dùng, hy vọng nó giúp đc bạn...
1/.Đầu tiên bên adapter recycler view bạn định nghĩa một hàm lọc data:
public void setFilter(List<Model> models){
listModels= new ArrayList<>();
listModels.addAll(models);
notifyDataSetChanged();
}
2/. Trong hàm onCreateOptionsMenu bên fragment:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(item,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
adapter.setFilter(listModel);
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
});
}
3/. Định nghĩa thêm một hàm trong fragment:
private List<Model> filter(List<Model> models, String query) {
query = query.toLowerCase();
final List<Model> filteredModelList = new ArrayList<>();
for (Model model : models) {
final String text = model.getName().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
4/. Trong onQueryTextChange:
@Override
public boolean onQueryTextChange(String newText) {
final List<CountryModel> filteredModelList = filter(listModel, newText);
adapter.setFilter(filteredModelList);
return true;
}