最近寫了一個項目,介面使用的是幀布局,裡面放置了listview顯示連絡人,以及右側有對連絡人的字母索引定位。結果在對連絡人listview設定onItemClickListener時,發現竟然不起作用。
下面的是布局檔案以及設定代碼
<FrameLayoutandroid:id="@+id/contact_fl"android:layout_width="match_parent"android:layout_height="match_parent" ><ListViewandroid:id="@+id/contact_lv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1.0"android:focusable="true"android:focusableInTouchMode="true"android:dividerHeight="1px"android:scrollbars="none" /> <LinearLayoutandroid:layout_width="28dp"android:layout_height="match_parent"android:layout_gravity="right|center"android:layout_marginBottom="6dp"android:layout_marginTop="10dp"android:gravity="right"android:orientation="vertical"><ListViewandroid:id="@+id/contact_letter"android:layout_width="28dp"android:layout_height="match_parent"android:layout_gravity="center_horizontal"android:focusable="true"android:focusableInTouchMode="true"android:scrollbars="none"/></LinearLayout></FrameLayout>
item布局檔案
View Code
<ImageViewandroid:scaleType="centerInside"android:layout_marginLeft="12dp"android:layout_marginTop="5dp"android:layout_marginRight="4dp"android:layout_marginBottom="3dp"android:layout_width="45dp"android:layout_height="45dp"android:src="@drawable/ic_contact_picture"android:id="@+id/contact_contactinfoitem_iv_photo"/> <TextView android:singleLine="true"android:ellipsize="marquee"android:textStyle="bold"android:marqueeRepeatLimit="marquee_forever"android:layout_height="wrap_content"android:layout_width="match_parent"android:layout_weight="1.0"android:id="@+id/contact_contactinfoitem_tv_name"android:text="xxx"/><TextView android:singleLine="true"android:ellipsize="marquee"android:textStyle="bold"android:marqueeRepeatLimit="marquee_forever"android:layout_height="wrap_content"android:layout_width="match_parent"android:layout_weight="1.0"android:id="@+id/contact_contactinfoitem_tv_phone"android:text="xxx"/>
在activity中設定onItemCllickListener
lv_contact.setOnItemClickListener(new OnItemClickListener(){ @Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id){Log.i("my", "onItemClick clicked"); } });
檢查發現onTouchListener裡面,返回結果是false,不是true,這意味著螢幕事件是繼續傳遞處理的,不會影響到onItemClickListener的處理。
去網上查了下發現有說 xml中有個焦點屬性會影響onTouchListener,需要將其改為false
再次檢測xml檔案,裡面確實設定有這兩個屬性
android:focusable="true"android:focusableInTouchMode="true"
這兩個屬性的看名字就知道到意思,
android:focusable="true"-------
設定是否獲得焦點。若有requestFocus()被調用時,後者優先處理。注意在表單中想設定某一個如EditText擷取焦點,光設定這個是不行
的,需要將這個EditText前面的focusable都設定為false才行。在Touch模式下擷取焦點需要設定
focusableInTouchMode為true
android:focusableInTouchMode="true"----
設定在Touch模式下View是否能取得焦點。
在xml中修改,這屬性為false,運行工程,發現還是一樣的onItemCllickListener不起作用,這就糾結了。
因為趕時間,乾脆在adapter中getView寫item的onclicklistener算了。代碼如下:
contact_fl.setOnClickListener(new OnClickListener(){ @Overridepublic void onClick(View view){Log.i("my", "onClick clicked"); } });
運行項目,item的點擊效果有了。但是同時有新的問題出現了。在我的ontouchListener種,onkeydown和onkeyup事件消失了。。。。
只有onkeymove。
經過分析得出結論,那就是肯定有方法或者屬性,設定的時候衝突了。
既然item的布局檔案中沒有button之類的空間。重點查看是否有方法或者屬性使得click事件消失了
再次到adapter中仔細檢查,發現有個兩個這樣的方法:
@Overridepublic boolean areAllItemsEnabled(){// all items are separatorreturn false;} @Overridepublic boolean isEnabled(int position){// all items are separatorreturn false;}
查看說明:
Returns true if the item at the specified position is not a separator. (A separator is a non-selectable, non-clickable item). The
result is unspecified if position is invalid. An ArrayIndexOutOfBoundsException should be thrown in that case for fast failure.
意思就是說,如果當前指定的位置不是一個separator--分隔字元(分隔字元是一個不能選中,不能點擊的item),那麼返回true。
那麼趕緊改為true,運行項目,效果都有了。