私はrecycviewを作成するためにCardviewを使用しています。CardViewをRecyclerViewでフィルタリングし、カードを更新せず、常に最初のカードを表示します。
私はEditTextフィールドでフィルタリングしていますが、これはデバッグからわかっています。
問題は、私がadapter.notifyDataSetChanged();
と呼んだとき、一番上のカードが残っていることです。あなたは"ge"
で2枚のカードがあることがわかります画像では、私が上でフィルタリングしてい
私の4つの文字列である
Antwerpen
Deinze
Gent
Edegem
を(どのように多くのカードに応じて、フィルタを介して得た)が、唯一の2トップ正しい文字列ではありません。
私は断片の中でcontainer.removeAllViewsInLayout();
を覗いてみましたが、どこで実装するのか分かりません。私はlayoutInflater
の前にOnCreateViewHolder
でこれを行いましたが、フィルターは機能しますが、カードはうまく表示されません。
私はJeffaleeによって与えられた答えを実装しましたUPDATE
は、応答をありがとう!
でも、同じ問題が残っていますが、私は以下のコードを投稿します。
アダプタ:
public class GemeenteAdapter extends RecyclerView.Adapter<GemeenteAdapter.GemeenteViewHolder> {
private List<Gemeente> gemeentes;
private List<Gemeente> filteredList;
public GemeenteAdapter(List<Gemeente> gemeentes, List<Gemeente> original) {
this.gemeentes = gemeentes;
filteredList = new ArrayList<>();
}
@Override
public int getItemCount() {
if (isFilterActive) {
return filteredList.size();
} else {
return gemeentes.size();
}
}
@Override
public void onBindViewHolder(GemeenteAdapter.GemeenteViewHolder holder, int i) {
Gemeente gemeente;
if (isFilterActive) {
gemeente = filteredList.get(i);
} else {
gemeente = gemeentes.get(i);
}
GemeenteViewHolder.vNaam.setText(gemeente.naam);
}
@Override
public GemeenteViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_cardview_small, viewGroup, false);
return new GemeenteViewHolder(v);
}
public static class GemeenteViewHolder extends RecyclerView.ViewHolder {
protected static TextView vNaam;
public GemeenteViewHolder(View v) {
super(v);
vNaam = (TextView) v.findViewById(R.id.txtNaam);
}
}
/**
* FILTER TEST 2
*/
boolean isFilterActive = false;
public void setFilter(String searchCriteria) {
setFilteredItems(searchCriteria);
isFilterActive = true;
notifyDataSetChanged();
}
public void clearFilter() {
isFilterActive = false;
notifyDataSetChanged();
}
private void setFilteredItems(String searchCriteria) {
System.out.println(searchCriteria);
for (Gemeente item : gemeentes) {
if (item.getNaam().toLowerCase().trim().contains(searchCriteria.toLowerCase())) {
System.out.println(item.getNaam());
filteredList.add(item);
}
}
}
FRAGMENT:
public class FragmentSearch extends Fragment {
//Methode om de fragment te initializeren
public static FragmentSearch newInstance() {
FragmentSearch fragment = new FragmentSearch();
return fragment;
}
public FragmentSearch() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recycler_gemeente, container, false);
Context context = getActivity();
RecyclerView rv = (RecyclerView) view.findViewById(R.id.cardList);
rv.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(context);
llm.setOrientation(LinearLayoutManager.VERTICAL);
rv.setLayoutManager(llm);
Gemeente gemeente = new Gemeente();
final GemeenteAdapter adapter = new GemeenteAdapter(gemeente.init(),gemeente.init());
rv.setAdapter(adapter);
/**
* Set filter when text is changed in EditText
*/
final EditText yourEditText = (EditText) view.findViewById(R.id.edittext);
yourEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
adapter.setFilter(yourEditText.getText().toString());
}
});
return view;
}
私は、これはいくつかの詳細は君たちを与える願っています。
こんにちは、問題は解決しましたか?もしそうなら、あなたの解決策について助言してもらえますか?私も同様の問題に直面しています。 – AJW