2012-07-16 69 views
0

我已經實現了一個ListView,其中的每個元素都包含一個複選框和一個按鈕。我寫了適配器的觀點如下:按鈕列表 - 只有第一個按鈕寄存器

public class myadapter extends SimpleAdapter 
{ 
    LayoutInflater mLayoutInflater; 

    public myadapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 
    { 
     super(context, data, resource, from, to); 
     mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     View view = null; 

     Log.i("xx","getView called: position="+position); 

     if (convertView != null) 
     { 
      view = convertView; 
     } 
     else 
     {  
      view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false); 
     } 

     Button buttonEdit = (Button) view.findViewById(R.id.editbut); 
     CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox); 

     buttonEdit.setOnClickListener(new OnClickListener() 
     { 
      public void onClick(View arg0) 
      { 
       Log.i("xx","Button pressed! position ="+position); 
      } 
     }); 
     cb.setOnCheckedChangeListener(new OnCheckedChangeListener() 
     { 
      @Override 
      public void onCheckedChanged(CompoundButton arg0, boolean arg1) 
      { 
       Log.i("xx","Checkbox changed! position ="+position); 
      } 
      }); 

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

在運行時,如果我在我的名單上排在點擊一個按鈕,我總是看到日誌輸出「按鈕,按下位置!= 0」。同樣,如果我點擊複選框,我會看到「Checkbox changed!position = 0」。如果我點擊列表中任何其他元素上的按鈕,問題就來了。有時我會看到正確的日誌消息,但有時候我什麼也看不到。有任何想法嗎?

編輯:這裏是我的custom_row_view.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:layout_width="142dp" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 
      <TextView android:id="@+id/text1"   
       android:textSize="16sp"   
       android:textStyle="bold" 
       android:textColor="#FFFF00"   
       android:layout_width="match_parent"   
       android:layout_height="fill_parent"/> 
      <TextView android:id="@+id/text2"   
       android:textSize="12sp"   
       android:textStyle="bold"  
       android:layout_width="match_parent"   
       android:layout_height="fill_parent"/> 
      <TextView android:id="@+id/text3" 
       android:typeface="sans" 
       android:textSize="14sp" 
       android:textStyle="italic" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"/> 

     </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="right" > 



    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
        android:focusable="false" 
      android:focusableInTouchMode="false" 
     android:text="" /> 
     <Button 
      android:id="@+id/editbut" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:text="Edit" /> 
     </LinearLayout> 
    </LinearLayout> 



</LinearLayout> 
+0

爲什麼ü用 「視圖」 當u也可以使用convertView,而不是直接夠嗎? – pixelscreen 2012-07-16 13:40:20

+0

每次在行上添加新按鈕時。更好的方法是將按鈕對象保存在靜態類中,並僅當視圖爲空時才添加。 – 2012-07-16 13:41:52

+0

@ user735675:我只是從其他地方複製代碼 - 我沒有聲稱理解它。 – Mick 2012-07-16 13:42:49

回答

0

做這樣

@Override 
public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View view = convertView; 

    Log.i("xx","getView called: position="+position); 

    if (view == null) 
    { 
     view = convertView;    
     view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false); 
    } 
    Button buttonEdit = (Button) view.findViewById(R.id.editbut); 
    CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox); 

    return view; 
} 
+0

對不起 - 它沒有區別 - 完全相同的症狀 – Mick 2012-07-16 13:41:22

+0

改變這個返回super.getView(position,convertView,parent);返回視圖; – 2012-07-16 13:42:30

+0

「返回視圖;」...以及我現在看到正確的日誌消息的那種工作方式 - 但現在沒有顯示任何列表項的文本比賽。 – Mick 2012-07-16 13:46:43

0

做到這一點:

Button buttonEdit = (Button) view.findViewById(R.id.editbut); 
      CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox); 
      buttonEdit.setTag(String.valueOf(positin)); 
      cb.setTag(String.valueOf(positin)); 
      buttonEdit.setOnClickListener(new OnClickListener() 
      { 
      public void onClick(View arg0) 
      { 
      Log.i("xx","Button pressed! position ="+arg0.getTag()); 
      } 
      }); 
     cb.setOnCheckedChangeListener(new OnCheckedChangeListener() 
     { 
     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean arg1) 
     { 
     Log.i("xx","Checkbox changed! position ="+arg0.getTag();); 
     } 
      }); 
您使用 OnClickListener()內爲

內心階層。對於內部類,位置的值保持爲零。直到你在按鈕上設置了標籤(),然後從按鈕中獲取標籤。

+0

對不起 - 它沒有區別。 – Mick 2012-07-16 13:57:42

0

您正在返回超類值,並將convertview作爲參數。

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

,但你這樣做:

if (convertView != null) 
    { 
     view = convertView; 
    } 
    else 
    {  
     view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false); 
    } 

如果convertView爲空,會人爲增加一個新的觀點,但你不回來了。

我的建議是

return view; 

,而不是

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

這應該

+0

在RajaReddy的回答下看到評論。 – Mick 2012-07-16 14:01:35

+0

「,但現在沒有顯示任何列表項的文本內容。」 你的代碼看起來像你沒有在控件上插入任何文本 – JesusS 2012-07-16 14:04:54