1

CommonswareのMergeAdapterとマージされたListViewまたは複数のListViewの組み合わせを返すアクティビティ内で問題が発生しています。これは、検索クエリに基づいて1つまたは複数の異なるカテゴリからの結果を返す検索アクティビティです。カテゴリが1を超える場合は、ヘッダーを挿入します。ヘッダーは、カテゴリの名前である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;
}

}

ご覧のとおり、必要な場合にのみ表示されます。そして、私のアクティビティでは、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();
    }

したがって、1つのアダプタからカテゴリが1つしかない場合は、すべて問題なく動作します。それらのうちの2つから結果が得られた瞬間、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)
4

2 に答える 2

1

さて、解決策は異なり、はるかに単純であることがわかりました。if ステートメントでは、次のように変更する必要がif (position < this.firstAdapter.getCount())ありました。 if ((position < this.firstAdapter.getCount() && position >= 0))

このようにして、負の数が発生しないようにし、ヘッダーの数に関係なくインデックスが常に正しいようにします。

于 2012-06-28T20:59:52.060 に答える
0

elseまたはreturnロジックが必要だと思いますonListItemClick()

つまり、returns 、returnspositionとしましょう。最初のブロック ( is greater than )を通過し、ここで( is greater than ) から 1 を減算して処理します。次に、2 番目のブロック ( is greater than )を通過します。ここで( is greater than ) から 1 を減算すると、要素を取得しようとしてクラッシュします。で識別される行は 1 つしかないため、アダプタの 1 つにしか存在できず、既存のコードはそのケースを処理しません。1firstAdapter.getCount()383secondAdapter.getCount()27if3830position0270position-1-1position

于 2012-06-28T12:12:20.257 に答える