gpt4 book ai didi

android - 在 android listview 上使用过滤时出错?

转载 作者:行者123 更新时间:2023-11-29 15:22:00 25 4
gpt4 key购买 nike

我正在尝试在 android 应用程序中向我的 ListView 添加筛选。它无法正常工作,因为在我的搜索框中写入 3-4 个字母后出现以下异常。

07-02 12:14:48.348: E/AndroidRuntime(22028): FATAL EXCEPTION: main
07-02 12:14:48.348: E/AndroidRuntime(22028): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
07-02 12:14:48.348: E/AndroidRuntime(22028): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
07-02 12:14:48.348: E/AndroidRuntime(22028): at java.util.ArrayList.get(ArrayList.java:304)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337)
07-02 12:14:48.348: E/AndroidRuntime(22028): at com.sphinx.indianrailways.adapters.CityAdapter.getView(CityAdapter.java:57)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.AbsListView.obtainView(AbsListView.java:2143)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.ListView.makeAndAddView(ListView.java:1831)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.ListView.fillDown(ListView.java:674)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.ListView.fillSpecific(ListView.java:1332)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.ListView.layoutChildren(ListView.java:1630)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.AbsListView.onLayout(AbsListView.java:1994)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.View.layout(View.java:14008)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.View.layout(View.java:14008)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.View.layout(View.java:14008)
07-02 12:14:48.348: E/AndroidRuntime(22028): at android.view.ViewGroup.layout(ViewGroup.java:4373)

我的过滤代码如下:

filterTextWatcher = new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int start, int before,
int count) {
// When user changed the Text by typing in search box
adapter.getFilter().filter(cs);
}

@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
}
};

citySearchBox.addTextChangedListener(filterTextWatcher);

我的 StationAdapter.java 代码是:

    public class CityAdapter extends ArrayAdapter<City> {
ArrayList<City> cityLists = new ArrayList<City>();
private Context context;
public String noInternet = "No network connectivity.Try again later.";
City city= null;

public CityAdapter(Context context, int textViewResourceId,
ArrayList<City> cityLists) {
super(context, textViewResourceId, cityLists);
this.context = context;
this.cityLists = cityLists;
}

static class ViewHolder {
protected TextView cityCode;
protected TextView cityName;
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflator = ((Activity) context).getLayoutInflater();
convertView = inflator.inflate(R.layout.single_city_item, null);
holder = new ViewHolder();

holder.cityCode = (TextView) convertView
.findViewById(R.id.cityCode);
holder.cityName = (TextView) convertView
.findViewById(R.id.cityName);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
city= getItem(position);

holder.cityCode.setText(city.getCityCode());
holder.cityName.setText(city.getCityName());
return convertView;
}
}

我知道 arraylist 当时可能有 1 个元素,它试图通过 list[1] 访问它,这会引发 nullpointerexception。但是我需要在我的代码中更改什么来解决这个问题。

最佳答案

经过我们的讨论,我认为问题在于:

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

这使得适配器认为它的大小大于正常大小(因为它的大小是固定的并且在您过滤后不会改变)并且在 getView() ( city= getItem(position);) 正在被调用。

您应该实现 Filterable 接口(interface) (getFilter()),如问题 1 , 2还有这个example .这将在每次调用 getFilter() 时更新 cityLists 数组,它的大小将正常返回,同时也会更新 Adapter (notifyDataSetChanged())

编辑

另一种方法是删除您的 getCount()(让 super 方法生效)。这将在每次应用过滤器时更新大小,而不是返回固定的 cityLists.size() 并让适配器认为其大小大于其拥有的数据。基本上,您要么像以前那样实现 getCount(),另外添加 getFilter() 以在每次过滤时更改 cityLists 大小,或者, 让系统同时处理(不要实现 getFilter()getCount())

关于android - 在 android listview 上使用过滤时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17419277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com