0

ダイアログフラグメント内にリストビューがあります。リストビューは正常に機能し、で設定されていonActivityCreated()ます。例えば

SimpleAdapter adapter = new SimpleAdapter(getActivity(), list,
        R.layout.dialog_list_row, from, to);

mListView.setAdapter(adapter);

adapterただし、 (上記のように)を追加したlistview後、なぜ子にアクセスできないのかがわかりません。例えば

mListView.getChildAt(0).setEnabled(false);

のリストアイテムに対してこの変更を実行していますonResume()

4

3 に答える 3

2

ListViewアイテムは、表示されるまでに時間がかかります。コードは、onResumeメソッドにヒットするとすぐに実行されます。

setEnabled(false);の場合 は特定のアイテムで呼び出されますが、listViewに子があるかどうかはまだレンダリングされていないため、Androidにはわかりません。

以下のスニペットをお試しください。

listView.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {
        listView.setSelection(0); //So your listview will bring first child in focus.
        listView.getChildAt(0).setEnabled(false);

    }
});
于 2012-11-23T09:27:58.677 に答える
1

子ビューは、ListViewが描画を開始した後にのみ存在するためです。これは、再開後に発生します。

SimpleAdapterを拡張して、ビューを返す前にビューに変更を加えることができるかもしれません。例えば:

public static class MyAdapter extends SimpleAdapter{

public MyAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
    super(context, data, resource, from, to);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v =super.getView(position, convertView, parent);
    v.setEnabled(false);
    return v;
}

}
于 2012-11-23T09:28:23.683 に答える
1

最も簡単な解決策は、アダプターをすばやく拡張して、isEnabledとareAllItemsEnabledに適切な値を返すことです。

Androidでビューがリサイクルされるため、ビューの有効化は正しく機能しません。

編集

小さなコード:

public class DisableAdapter extends SimpleAdapter {

    public DisableAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return position != 0;
    }
}

これは単にリストの最初の項目を無効にします。AFAIK、これは適切な方法です。

于 2012-11-23T10:45:39.873 に答える