2012-11-16 37 views
0

列表視圖用複選框,CustomCursorAdapterOnItemClick不復選框響應的ListView和customcursoradapter

在ListActivity.java

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.list); 

    ListView listView = (ListView) findViewById(R.id.lists); 
    listView.setItemsCanFocus(false); 
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    //create Cursor called cursor 
    listAdapter = new DetailListAdapter(this, cursor); 
    getLoaderManager().initLoader(LOADER_ID, null, this); 
    listView.setAdapter(listAdapter); 
    listView.setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View v, int arg2, long arg3) 
     { 
      //want to call startactionmode with class implementing ListView.MultiChoiceModeListener 
     } 

    }); 

} 

在DetailListAdapter.java

public class DetailListAdapter extends CursorAdapter 
{ 
    private Context   context; 
    private ArrayList<Boolean> checked = new ArrayList<Boolean>(); 
    private LayoutInflater mLayoutInflater; 


    public DetailListAdapter(Context context, Cursor c) 
    { 
     super(context, c); 
     mContext = context; 
     mLayoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) 
    { 
     View v = mLayoutInflater.inflate(R.layout.list_item, parent, false); 
     return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) 
    { 
     final View view = v; 
     final int position = c.getInt(0); 
     String data = c.getString(c.getColumnIndexOrThrow("DATA")); 

     /** 
     * Next set the name of the entry. 
     */ 
     TextView list_text = (TextView) view.findViewById(R.id.listitemtext); 

     CheckBox checkbox_text = (CheckBox) view.findViewById(R.id.listitemcheckbox); 

     list_text.setText(data); 

     checked.add(position - 1, false); 
     checkbox_text.setOnCheckedChangeListener(new OnCheckedChangeListener() 
     { 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       if (isChecked) 
       { 
        view.setBackgroundColor(Color.GRAY); 
        checked.set(position - 1, true); 
       } else 
       { 
        view.setBackgroundColor(Color.BLACK); 
        checked.set(position - 1, false); 
       } 
      } 
     }); 

     checkbox_text.setChecked(!checkbox_text.isChecked()); 
    } 
} 

列表行XML是,

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

<CheckBox 
    android:id="@+id/check1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="20dp" 
    android:focusable="false" 
    /> 

<TextView 
    android:id="@+id/text1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/check1" 
    android:layout_toRightOf="@+id/check1" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    /> 

<TextView 
    android:id="@+id/text2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/text1" 
    android:layout_alignBottom="@+id/text1" 
    android:layout_marginLeft="20dp" 
    android:layout_toRightOf="@+id/text1" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    /> 

<TextView 
    android:id="@+id/text3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignRight="@+id/text2" 
    android:layout_below="@+id/text1" 
    android:layout_toRightOf="@+id/check1" 
    android:text="Small Text" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    /> 

</RelativeLayout> 

當我點擊模擬器中的列表項時,複選框被選中並且行變成灰色。 但是onitemclick沒有被調用。對於在列表中創建一行的佈局中的所有項目,我都有android:focusable =「false」和android:focusableInTouchMode =「false」。

+0

你想既'onCheckedChanged()'和'onItemClick()'與點擊火? – Sam

+1

我有類似的問題,我只爲xml中的複選框項目添加了android:focusable =「false」,並且它對我來說工作得很整齊......嘗試一下。 –

+0

是的,當我點擊列表項目時,我希望複選框被選中,並且菜單顯示在頂部,包含可以在該選定列表項目上執行的操作。 – anonymous

回答

1

我希望被選中的複選框,並在此可以對選中的列表項被perfomed含頂動作被顯示的菜單..

兩個OnClickListeners不能從一個觸摸事件被調用。如您所見,第一個偵聽器的onCheckedChanged()方法會消耗該事件以防止其到達onItemClick()方法。

我建議在您的行中使用Checkable佈局,以便維護您的檢查狀態並更改適配器的getView()以根據視圖回收站設置適當的背景顏色。

(發表在XML你的問題,如果你需要這方面的幫助。)

+0

我添加了列表行xml – anonymous

+0

好吧,您正在使用多於一個TextView,所以30秒的答案不是一個選項。然而[這個答案](http://stackoverflow.com/a/12125857/1267661)詳細介紹瞭如何創建一個自定義的Checkable佈局。創建您自己的CheckableRelativeLayout並讓我知道它是如何發生的。 – Sam

+0

謝謝你的幫助。我實現了CheckableRelativeLayout,它似乎工作正常接受1問題。我將列表的選擇模式設置爲多選模式,但在界面上,我一次只能選擇一個列表行。當我選擇另一行時,前一個會被取消選中/取消選擇。 – anonymous