Listview setEnabled()导致空指针异常

时间:2012-11-23 09:21:28

标签: android android-listview

我在对话框片段中有一个列表视图。列表视图工作正常,并在onActivityCreated()中设置。 E.g。

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

mListView.setAdapter(adapter);

但是,我不明白为什么一旦我将adapter(如上所述)添加到我的listview,为什么我无法访问这些孩子。 E.g。

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

我正在对onResume()中的列表项执行此更改。

3 个答案:

答案 0 :(得分:2)

ListView项目需要时间才能显示。您的代码在点击onResume方法后立即执行。

当setEnabled(false);调用特定项目你的机器人不知道你的listView是否有任何孩子,因为它们没有被渲染。

尝试以下代码段。

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);

    }
});

答案 1 :(得分: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;
}

}

答案 2 :(得分: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,这是正确的方法。

相关问题