2012-11-23 128 views
0

我有一個對話框片段內的列表視圖。列表視圖正常工作,正在設置onActivityCreated()。例如。Listview setEnabled()導致空指針異常

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

mListView.setAdapter(adapter); 

不過,我不是adapter(如上)理解爲什麼當我已經添加到我的listview,我爲什麼不能訪問的孩子們。例如。

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

我正在對onResume()中的列表項目執行此更改。

回答

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,這是正確的方法。

+0

謝謝,我想了很多。 – HGPB

2

ListView項目需要一段時間才能顯示。您的代碼只要碰到onResume方法就會立即執行。

當setEnabled(false);被稱爲特定的項目你的android不知道你的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); 

    } 
}); 
+0

謝謝,我已經實現了你的建議,但它仍然會導致一個空指針(用於記錄)。我覺得奇怪,但這表明onScroll在視圖完全呈現(可能)之前被調用。不錯的建議。 – HGPB

+0

我可以工作,但更多的是一個骯髒的黑客。該啓用與滾動無關,您只是濫用這種方法來知道何時回收視圖。當你有幾個項目時,我可能不工作,因爲getChildAt(0)可以是第一個可見的項目,而不是第一個項目。 – njzk2

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

} 
+0

我希望不必延伸任何東西。但我開始認爲我不能做setEnable()我想怎麼樣。所以我會放棄這一點。 – HGPB