gpt4 book ai didi

android - 带有标题和 MergeAdapter 的可点击 ListViews 在 ListItemClick 上使应用程序崩溃

转载 作者:行者123 更新时间:2023-11-30 04:08:26 25 4
gpt4 key购买 nike

我在返回一个 ListView 或多个 ListView 的组合并与来自 Commonsware 的 MergeAdapter 合并的 Activity 中遇到问题。这是一种搜索 Activity ,基于搜索查询将返回来自一个或多个不同类别的结果。当类别超过 1 个时,我插入一个标题,这是另一个只有一行的 ListView - 类别的名称。

部分代码:

public class FirstAdapter extends ArrayAdapter<Address> {
public FirstAdapter (Context context, int resource,
int textViewResourceId, List<Address> objects) {
super(context, resource, textViewResourceId, objects);
}

public View getView (int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
Address location = this.getItem(position);

TextView textView = (TextView) view.findViewById(R.id.SearchResultTextAddress);
textView.setText(location.address);

return view;
}

然后我有一个头适配器:

public class HeaderAdapter extends ArrayAdapter<String> {
private String header;

public HeaderAdapter(Context context, int resource,
int textViewResourceId, String header) {
super(context, resource, textViewResourceId, new ArrayList<String>());

this.header = header;
}

public void setVisible(boolean visible) {
if (visible) show();
else hide();
}

public void show() {
clear();
add(this.header);
}

public void hide() {
clear();
}

public View getView (int position, View convertView, ViewGroup parent) {
return super.getView(position, convertView, parent);
}

public String getHeader() {
return header;
}

public void setHeader(String header) {
this.header = header;
}

@Override
public boolean isEnabled(int position) {
return false;
}

}

如您所见,只有在必要时才会显示。在我的 Activity 中,我重写了一个 onListItemClick:

@Override
protected void onListItemClick(ListView listview, View view, int position, long id) {
super.onListItemClick(listview, view, position, id);

if (this.firstAdapter.getCount() > 0) {
position--;
if (position < this.firstAdapter.getCount()) onRepClick(this.firstAdapter.getItem(position));
position = position - this.firstAdapter.getCount();
}

if (this.secondAdapter.getCount() > 0) {
position--;
if (position < this.secondAdapter.getCount()) onAusschussClick(this.secondHeader.getItem(position));
position = position - this.secondAdapter.getCount();
}

因此,当我只有一个适配器中的一个类别时,一切正常。当我从其中两个获得结果时,我得到一个 ArrayIndexOutOfBoundsException。我认为我获得职位的逻辑不正确。任何想法将不胜感激,谢谢。

这是堆栈跟踪:

06-28 12:56:54.291: E/AndroidRuntime(3963): FATAL EXCEPTION: main
06-28 12:56:54.291: E/AndroidRuntime(3963): java.lang.ArrayIndexOutOfBoundsException
06-28 12:56:54.291: E/AndroidRuntime(3963): at java.util.ArrayList.get(ArrayList.java:313)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:298)
06-28 12:56:54.291: E/AndroidRuntime(3963): at com.jasamer.callarep.SearchActivity.onListItemClick(SearchActivity.java:136)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.widget.ListView.performItemClick(ListView.java:3513)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1849)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.os.Handler.handleCallback(Handler.java:587)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.os.Handler.dispatchMessage(Handler.java:92)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.os.Looper.loop(Looper.java:130)
06-28 12:56:54.291: E/AndroidRuntime(3963): at android.app.ActivityThread.main(ActivityThread.java:3835)
06-28 12:56:54.291: E/AndroidRuntime(3963): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 12:56:54.291: E/AndroidRuntime(3963): at java.lang.reflect.Method.invoke(Method.java:507)
06-28 12:56:54.291: E/AndroidRuntime(3963): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
06-28 12:56:54.291: E/AndroidRuntime(3963): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
06-28 12:56:54.291: E/AndroidRuntime(3963): at dalvik.system.NativeStart.main(Native Method)

最佳答案

好吧,解决方案变得不同而且简单得多。在 if 语句中,我必须更改:if (position < this.firstAdapter.getCount())到以下: if ((position < this.firstAdapter.getCount() && position >= 0))

通过这种方式,我将确保不会出现负数,并且无论我有多少 header ,索引都将始终正确。

关于android - 带有标题和 MergeAdapter 的可点击 ListViews 在 ListItemClick 上使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11243579/

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