2011-07-11 195 views
0

我有一個ListView,顯示用戶從活動內動態生成的數組。基本上,該程序是一個計時器,用戶可以選擇一個他們想要報警發生的時間,並提供關於當該報警發生時應該做什麼的描述。Android ListView:當不顯示TextView時爲空

我有ListView設置使用SimpleAdapter調用一個alarm_list_item.xml,其中包含兩個TextView的和我想顯示列表中的每個項目的圖標。

adapter = new AlarmListAdapter(this, stringArray, R.layout.alarm_list_item, new String[] {"name", "alert"}, new int[] {R.id.ListViewItem, R.id.ListViewItemSub}); 

當用戶選擇不添加自定義對話框,我想設置的TextView的知名度alarm_list_item.xml到GONE所以它不會顯示爲名單上的空白區域報警。當我嘗試從活動中設置此參數時,我得到一個NullPointerException,因爲我假設xml文件實際上不是一個對象,但或多或​​少只是用作ListView的引用。有沒有辦法做到這一點?

到目前爲止,我通過將文本設置爲「沒有自定義通知集」來解決問題,但我希望有一個更清潔的選項,並在不使用時將它們全部刪除。

alarm_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 

<ImageView 
    android:src="@drawable/alarm_icon" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:layout_marginLeft="10dp"> 
</ImageView> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 
    <TextView 
     android:id="@+id/ListViewItem" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:textSize="16sp"> 
    </TextView> 
    <TextView 
     android:id="@+id/ListViewItemSub" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:textSize="10sp"> 
    </TextView> 
</LinearLayout> 

片段,其中的ListView駐留的活性:

 stringArray = new ArrayList<HashMap<String, String>>(); 

    list = (ListView)findViewById(R.id.AlarmListView); 
    adapter = new AlarmListAdapter(this, stringArray, R.layout.alarm_list_item, new String[] {"name", "alert"}, new int[] {R.id.ListViewItem, R.id.ListViewItemSub}); 
    list.setAdapter(adapter); 
    registerForContextMenu(list); 

} 

private void updateListArray(){ 
    stringArray.clear(); 
    if(!arrayList.isEmpty()){ 
    for(int i=0; i<arrayList.size(); i++){ 

     String name = arrayList.get(i).getName(); 
     String alert = arrayList.get(i).getAlertDialog(); 

     if(alert == ""){ 
      alert = "No Custom Notification Set"; 
     } 

     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("name", name); 
     map.put("alert", alert); 
     stringArray.add(map); 
    } 
    } 
} 

適配器代碼:

public AlarmListAdapter(Context context, ArrayList<HashMap<String, String>> list, int textViewResourceId, String[] fields, int[] textViewId) { 
    super(context, list, textViewResourceId, fields, textViewId); 
    this.list = list; 
    this.context = context; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

View v = convertView; 
if (v == null) { 
    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.alarm_list_item, null); 
    Log.i("getView = ", "" + v); 
    Log.i("list alert = ", "" + list.get(position).get("alert")); 
} 


if(list.get(position).get("alert") == null){  
    v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE); 
} 

return super.getView(position, convertView, parent); 

} 

public void forceReload(){ 
    notifyDataSetChanged(); 
} 

logcat的錯誤:

07-11 12:16:23.543: ERROR/AndroidRuntime(190): Uncaught handler: thread main exiting due to uncaught exception 
07-11 12:16:23.573: ERROR/AndroidRuntime(190): java.lang.NullPointerException 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.AbsListView.obtainView(AbsListView.java:1275) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1147) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.ListView.onMeasure(ListView.java:1060) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:619) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:280) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:350) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:350) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:464) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.View.measure(View.java:7703) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewRoot.performTraversals(ViewRoot.java:747) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1613) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.os.Looper.loop(Looper.java:123) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
07-11 12:16:23.573: ERROR/AndroidRuntime(190):  at dalvik.system.NativeStart.main(Native Method) 

回答

2

想通了。

SimpleAdapter getView超越代碼:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

View v = convertView; 
if (v == null) { 
    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.alarm_list_item, null); 
} 


if(list.get(position).get("alert") == null){  
    v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE); 
} 

return super.getView(position, convertView, parent); 

} 

的問題是與return語句。我需要返回超值。

+0

由於單元格的重用,你需要放一個'else'子句讓它再次可見。 – Borja

0

您需要在乘坐適配器的bindViewgetView方法:在那裏你可以設置所期望的視圖的可見性。 This是格式不正確(但技術上正確)的示例。

編輯:嘗試是這樣的:

@Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
View v = super.getView(position, convertView, parent); 
         if(list.get(position).get("alert") == ""){  
     v.findViewById(R.id.ListViewItem).setVisibility(View.GONE); 
     v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE); 
    } 
return convertView; 

} 
+0

所以在覆蓋getArea之後,我應該使用for循環遍歷ArrayList填充ListView並檢查值是否爲空?如果它爲空,我是否需要膨脹視圖才能編輯可見性設置?適配器擴展了SimpleAdapter,所以我似乎無法使用findViewById引用TextView。 – ryandlf

+0

對於適配器中的每個項目,「getView」將被調用一次。對於每個調用,您都將傳遞當前的視圖和位置:如果傳遞的視圖爲空,則從XML擴展視圖,然後在需要時調整可見性。 – Femi

+0

我更新了我的問題以包含適配器代碼。每次嘗試運行此操作時,我都會收到nullpointerexception。 getView是否實際運行通過傳遞到適配器的數組中的每個項目? – ryandlf

0

嘗試是這樣的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

View v = convertView; 
if (v == null) { 
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.alarm_list_item, null); 
} 


if(list.get(position).get("alert") == ""){  
    v.findViewById(R.id.ListViewItemSub).setVisibility(View.GONE); 
} 

return convertView; 

} 
+0

使用此代碼獲取相同的logCat錯誤。錯誤是圍繞着能夠獲得視圖而旋轉,但我無法弄清楚它爲什麼看不到視圖。我在適配器類中運行它,而不是在與適配器關聯的活動中運行。這是一個問題嗎? – ryandlf

+0

嗯我真的不知道是什麼造成它現在 – matsjoe