Java Android Listview:搜索后项目不会重新显示
我有一个小应用程序,上面列出了一些叫做“Spielort”的项目。通过EditText搜索它们效果很好,但是当删除搜索字符串或仅删除其中的字母时,整个项目列表不会重新出现。有人知道为什么,并可能提供一些关于如何编辑我的代码的建议吗 SpielortAdapter.javaJava Android Listview:搜索后项目不会重新显示,java,android,android-studio,Java,Android,Android Studio,我有一个小应用程序,上面列出了一些叫做“Spielort”的项目。通过EditText搜索它们效果很好,但是当删除搜索字符串或仅删除其中的字母时,整个项目列表不会重新出现。有人知道为什么,并可能提供一些关于如何编辑我的代码的建议吗 SpielortAdapter.java package fasde.android.distanceapp; import android.content.Context; import android.view.LayoutInflater; import an
package fasde.android.distanceapp;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class SpielortAdapter extends ArrayAdapter<Spielort> {
private Context context;
private List<Spielort> spielortList;
private List<Spielort> filteredList;
private List<Spielort> allDataList;
private SpielortFilter filter;
public SpielortAdapter(@NonNull Context context, @LayoutRes ArrayList<Spielort> spielortList) {
super(context, 0, spielortList);
this.context = context;
this.spielortList = spielortList;
this.allDataList = spielortList;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItem = convertView;
if (listItem == null) {
listItem = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
}
Spielort ort = spielortList.get(position);
TextView spielort = listItem.findViewById(R.id.textView_ort);
spielort.setText("\t" + ort.getSpielort());
TextView km = listItem.findViewById(R.id.textView_km);
km.setText(Integer.toString(ort.getDistanz()) + "km");
TextView kosten = listItem.findViewById(R.id.textView_kosten);
kosten.setText(ort.getKosten().toString() + "€");
TextView kreis = listItem.findViewById(R.id.textView_kreis);
kreis.setText(ort.getKreis().getName());
return listItem;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new SpielortFilter();
}
return filter;
}
private class SpielortFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
if (constraint != null && constraint.toString().length() > 0) {
filteredList = new ArrayList<>();
for (Spielort ort : spielortList) {
if (ort.getSpielort().toLowerCase().contains(constraint)) {
filteredList.add(ort);
}
}
results.count = filteredList.size();
results.values = filteredList;
} else {
results.values = allDataList;
results.count = allDataList.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, @NotNull FilterResults results) {
spielortList = (ArrayList<Spielort>) results.values;
notifyDataSetChanged();
}
}
}
从
publishResults
方法中删除以下3行
clear();
for (Spielort ort : spielortList) {
add(ort);
}
notifyDataSetInvalidated();
更新您的performFiltering()
constraint=constraint.toString().toLowerCase();
FilterResults results=新的FilterResults();
filteredList=新建ArrayList();
对于(Spielort ort:allDataList){
如果(ort.getSpielort().toLowerCase().contains(约束)){
filteredList.add(ort);
}
}
results.count=filteredList.size();
results.values=filteredList;
现在应用程序在添加searchingErrorlog时崩溃。是的,检查了get count方法中返回的内容?我没有覆盖它,所以我猜它是来自ArrayAdapters getCount()的int。覆盖它并返回spielortList.size()
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: fasde.android.distanceapp, PID: 9529
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:437)
at fasde.android.distanceapp.SpielortAdapter.getView(SpielortAdapter.java:42)
at android.widget.AbsListView.obtainView(AbsListView.java:2451)
at android.widget.HwAbsListView.obtainView(HwAbsListView.java:935)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1426)
at android.widget.ListView.onMeasure(ListView.java:1333)
at android.view.View.measure(View.java:23466)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:23466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
at android.view.View.measure(View.java:23466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1565)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:726)
at android.view.View.measure(View.java:23466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6834)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:847)
at android.view.View.measure(View.java:23466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2954)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1753)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2041)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:812)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
I/Process: Sending signal. PID: 9529 SIG: 9
Process 9529 terminated.
clear();
for (Spielort ort : spielortList) {
add(ort);
}
notifyDataSetInvalidated();
constraint = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
filteredList = new ArrayList<>();
for (Spielort ort : allDataList) {
if (ort.getSpielort().toLowerCase().contains(constraint)) {
filteredList.add(ort);
}
}
results.count = filteredList.size();
results.values = filteredList;