2012-08-28 204 views
1

問題

我想創建一個ListView是類同股票Gmail應用。我在左邊有一個CheckBox,右邊有兩個TextView。我可以選擇CheckBox,但不能選擇其餘的佈局。我想選中複選框來激活上下文動作欄,但其餘的原始應該啓動另一個活動(對於聽衆來說兩個不同的動作)。 我的列表項如下: enter image description hereListView項,集裝箱

問題

我怎樣才能創建一個列表項,其中列表項的不同區域觸發不同的動作?

代碼

列表項的佈局:

<merge xmlns:android="http://schemas.android.com/apk/res/android" > 
<CheckBox 
    android:id="@+id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:focusable="false" /> 

<TextView 
    android:id="@+id/amount" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:gravity="right" /> 

<TextView 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="8dp" 
    android:layout_toRightOf="@+id/checkbox" /> 
</merge> 

列表項本身:

<?xml version="1.0" encoding="utf-8"?> 
<hu.gulyasm.fintrac.ui.TransactionItem xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item_root" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:padding="24dp" /> 

Finnaly我getView()在適配器方法,以及onClickListener

@Override 
public void onClick(View v) { 
    if (v.getId() == R.id.checkbox) { 
     Toast.makeText(getActivity(), "Checkbox pressed", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(getActivity(), "Item pressed", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
    LayoutInflater layoutInflater = getActivity().getLayoutInflater(); 
    TransactionItem view = (TransactionItem) layoutInflater.inflate(R.layout.list_item, arg2, false); 
    view.setOnClickListener(TransactionListFragment.this); 
    // View checkBox = view.findViewById(R.id.checkbox); 
    // checkBox.setOnClickListener(TransactionListFragment.this); 
    bindToExistingView(view, arg1); 
    return view; 
} 

回答

0

嘗試的複選框這個組合:

android:focusable="false" 
    android:focusableInTouchMode="false" 
+0

沒有喜悅。只有CheckBox可以被點擊,但在回調中收到的View的id是容器的ID。 – gmate

0

可以在getViewButtononCheckedChange設置onClick事件CheckBox。並記住要禁用可點擊項目的焦點,如ButtonCheckBox。以下是來自Cyril Mottier的兩篇非常詳細的博客文章。他們解釋詳細步驟以及如何解決問題。您的問題使用自定義按鈕和複選框在Don’t press everything!部分中修復。

package com.cyrilmottier.android.listviewtipsandtricks.widget; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.Button; 

public class DontPressWithParentButton extends Button { 

    public DontPressWithParentButton(Context context) { 
     super(context); 
    } 

    public DontPressWithParentButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DontPressWithParentButton(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void setPressed(boolean pressed) { 
     if (pressed && getParent() instanceof View && ((View) getParent()).isPressed()) { 
      return; 
     } 
     super.setPressed(pressed); 
    } 

} 

ListView Tips & Tricks #4: Add several clickable areas

ListView Tips & Tricks #5: Enlarged touchable areas

+0

不幸的是,複選框仍然被檢查。這種方法的另一個問題是,當我不得不擴展我的列表項目時,我可能會有更多的可觸摸/可點擊區域。隨着更多的領域,我不能使用不同的回調方法,因爲它在文章中使用。我認爲唯一的方法就是在視圖內部處理,並通過自定義回調接口通知片段/活動,或者使用視圖的id -s。我開始認爲第二個想法不能實現,我必須堅持第一個想法。 :S – gmate