2013-12-20 69 views
2

我想能夠點擊ListView項目中的按鈕。它應該與點擊整個項目有不同的效果。我意識到在stackoverflow上有幾個問題,但沒有任何建議適用於我。ListView中的按鈕不可點擊

ListView位於片段內。

佈局的片段:

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

    <TextView 
    android:id="@+id/event_list_separator" 
    style="?android:attr/listSeparatorTextViewStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="separator" 
    android:textColor="@android:color/white" /> 

    <LinearLayout 
    android:id="@+id/event_list_element" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:padding="6dip" > 

     <ImageView 
     android:id="@+id/event_list_element_icon" 
     android:layout_width="26dip" 
     android:layout_height="60dip" 
     android:layout_marginRight="6dip" 
     android:contentDescription="TODO" /> 

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

      <TextView 
      android:id="@+id/event_list_element_firstLine" 
      android:layout_width="match_parent" 
      android:layout_height="25dip" 
      android:text="item_header" 
      android:textSize="18sp" /> 

      <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="35dip" 
      android:orientation="horizontal" > 

       <TextView 
       android:id="@+id/event_list_element_secondLine" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:gravity="center_vertical" 
       android:ellipsize="marquee" 
       android:singleLine="true" 
       android:text="Description" 
       android:textSize="14sp" /> 

       <Button 
       android:id="@+id/event_list_element_button_1" 
       android:layout_width="132dip" 
       android:layout_height="match_parent" 
       android:drawableLeft="@drawable/ic_button1" 
       android:text="Participate" 
       android:textStyle="bold" 
       android:textSize="14sp" 
       /> 


       <Button 
       android:id="@+id/event_list_element_button_2" 
       android:layout_width="110dip" 
       android:layout_height="match_parent" 
       android:ellipsize="marquee" 
       android:drawableLeft="@drawable/ic_button2" 
       android:singleLine="true" 
       android:text="No thanks" 
       android:textStyle="bold" 
       android:gravity="center_vertical" 
       android:textSize="14sp" 
       /> 

       <TextView 
       android:id="@+id/event_list_element_additional_text" 
       android:layout_width="100dip" 
       android:layout_height="match_parent" 
       android:ellipsize="marquee" 
       android:singleLine="true" 
       android:gravity="center_vertical" 
       android:text="sample" 
       android:textStyle="bold" 
       android:textSize="14sp" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

我的目錄適配器:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".EventFragment" > 

    <ListView 
     android:id="@+id/event_list" 
     android:background="#C0FFFFFF" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="5dp" /> 

</RelativeLayout> 

每個列表項的佈局

public class EventAdapter extends ArrayAdapter<Event> { 
    static class ViewHolder { 
     TextView separator; 
     LinearLayout relativeLayout; 
     TextView eventHeader; 
     TextView eventDescription; 
     ImageView blueDot; 
     Button button1; 
     Button button2; 
    } 

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

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater)  
      _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.event_list_item, parent, false); 

      viewHolder = new ViewHolder(); 
      viewHolder.relativeLayout = (LinearLayout) convertView.findViewById(R.id.event_list_element); 
      viewHolder.blueDot = (ImageView) convertView.findViewById(R.id.event_list_element_icon); 
      viewHolder.eventHeader = (TextView) convertView.findViewById(R.id.event_list_element_firstLine); 
      viewHolder.eventDescription = (TextView) convertView.findViewById(R.id.event_list_element_secondLine); 
      viewHolder.button1 = (Button) convertView.findViewById(R.id.event_list_element_button1); 
      viewHolder.button2 = (Button) convertView.findViewById(R.id.event_list_element_button2); 
      viewHolder.separator = (TextView) convertView.findViewById(R.id.event_list_separator); 
      convertView.setTag(viewHolder); 
     } else{ 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     final Event item = getItem(position); 
     if (item != null) {  
      OnClickListener listener = new OnClickListener() { 
       @Override 
       public void onClick(View arg0) { 
        Toast.makeText(_context, "boo!", Toast.LENGTH_SHORT).show(); 
       } 
      }; 

      viewHolder.button1.setOnClickListener(listener);    
     } 
     return convertView; 
    } 
} 

的問題是,這兩個按鈕不點擊。我試着遠:

ListView listView = (ListView) rootView.findViewById(R.id.event_list); 
listView.setItemsCanFocus(true); 

我也試過上的按鈕設置:

android:focusable="true" 
android:clickable="true" 

我也嘗試用機器人:descendantFocusability。

我的任何嘗試都沒有使按鈕可點擊。

+0

嘗試將點擊監聽器移動到將ui元素與變量綁定的點。看看是否修復它,如果不是,那麼我認爲你的列表視圖正在吃事件。 –

+1

在Google上鍵入您的問題標題給了我:http://stackoverflow.com/questions/3045872/listview-and-buttons-inside-listview –

+0

謝謝,Ardo K.我在Google上看到了這一點。它不適合我。我能夠添加項目點擊偵聽器,但該按鈕沒有反應。 – Uli

回答

2

將屬性android:descendantFocusability="blocksDescendants"插入到每個列表項的父佈局聲明中。 該xml應該如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:descendantFocusability="blocksDescendants" 
android:background="#C0101010"> 

    <TextView 
    android:id="@+id/event_list_separator" 
    style="?android:attr/listSeparatorTextViewStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="separator" 
    android:textColor="@android:color/white" /> 

    <LinearLayout 
    android:id="@+id/event_list_element" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFFFFF" 
    android:padding="6dip" > 

     <ImageView 
     android:id="@+id/event_list_element_icon" 
     android:layout_width="26dip" 
     android:layout_height="60dip" 
     android:layout_marginRight="6dip" 
     android:contentDescription="TODO" /> 

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

      <TextView 
      android:id="@+id/event_list_element_firstLine" 
      android:layout_width="match_parent" 
      android:layout_height="25dip" 
      android:text="item_header" 
      android:textSize="18sp" /> 

      <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="35dip" 
      android:orientation="horizontal" > 

       <TextView 
       android:id="@+id/event_list_element_secondLine" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:gravity="center_vertical" 
       android:ellipsize="marquee" 
       android:singleLine="true" 
       android:text="Description" 
       android:textSize="14sp" /> 

       <Button 
       android:id="@+id/event_list_element_button_1" 
       android:layout_width="132dip" 
       android:layout_height="match_parent" 
       android:drawableLeft="@drawable/ic_button1" 
       android:text="Participate" 
       android:textStyle="bold" 
       android:textSize="14sp" 
       /> 


       <Button 
       android:id="@+id/event_list_element_button_2" 
       android:layout_width="110dip" 
       android:layout_height="match_parent" 
       android:ellipsize="marquee" 
       android:drawableLeft="@drawable/ic_button2" 
       android:singleLine="true" 
       android:text="No thanks" 
       android:textStyle="bold" 
       android:gravity="center_vertical" 
       android:textSize="14sp" 
       /> 

       <TextView 
       android:id="@+id/event_list_element_additional_text" 
       android:layout_width="100dip" 
       android:layout_height="match_parent" 
       android:ellipsize="marquee" 
       android:singleLine="true" 
       android:gravity="center_vertical" 
       android:text="sample" 
       android:textStyle="bold" 
       android:textSize="14sp" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 
0

我找到了解決方案!我想定期更新事件列表(現在它是一個線程,每x毫秒運行一次,稍後我想切換到僅在發生更改時更新事件列表)。無論如何,代碼是:(在我的主要活動):

private BroadcastReceiver _bReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(RECEIVE_EVENT)) { 
      Bundle bundle = intent.getExtras(); 
      Event event = (Event) bundle.get("event"); 
      showEvent(event); 
     } 
    } 
}; 

private void showEvent(final Event event){ 
    final Context context = this; 

    runOnUiThread(new Runnable() { 
     public void run() { 
      final ListView listview = (ListView) findViewById(R.id.event_list); 

      EventAdapter adapter = new EventAdapter(context, id.event_list, getEventList()); 
      listview.setAdapter(adapter);  
     } 
    }); 
} 

每次設置適配器肯定是不正確的做法。一旦我改變它只設置一次適配器,它就像建議使用android:descendantFocusability =「blocksDescendants」

+0

很高興知道它與我的建議android:descendantFocusability =「blocksDescendants」:) –

+0

謝謝!我接受了該解決方案。 – Uli