就是想實現類似這個效果。(因爲的demo,不要關注好不好看了)
那先講講主要出現的幾個問題吧:
1.listview出現點擊控件無效的情況,onItemClick事件無響應的情況
在自定義item的視圖的過程中加入了gridview、checkbox、imageButton等控件,然後就可能出現這種無法觸發onItemClickListener的問題。
解決方法:在自己定義的item的佈局最外層的layout 加入 這個標籤 android:descendantFocusability="blocksDescendants",就可以點擊了,這是什麼意思呢?就好像是把佈局中所有搶viewgroup焦點的控件全部覆蓋了先,意味着這個自定義佈局就不會受其中的子控件的影響而失去點擊時間吧,我是這麼想的。
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@color/white"
- <span style="background-color: rgb(255, 255, 0);"><font color="#ff0000">android:descendantFocusability="blocksDescendants"</font></span>
- android:orientation="vertical" >
- ...........
我是這麼做的先繼承Gridvewi,然後重寫onMeasure.如下代碼:
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
- MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
下面是我實現的gridview代碼:
- package com.example.testlistview;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.widget.GridView;
- public class MyGridView extends GridView {
- private OnTouchInvalidPositionListener onTouchInvalidPositionListener;
- public MyGridView(Context context) {
- super(context);
- }
- public MyGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
- MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- //先創建一個監聽接口,一旦點擊了無效區域,便實現onTouchInvalidPosition方法,返回true or false來確認是否消費了這個事件
- if(onTouchInvalidPositionListener!=null){
- if(!isEnabled()){
- return isClickable()||isLongClickable();
- }
- int motionPosition = pointToPosition((int)ev.getX(), (int)ev.getY());
- if(ev.getAction()==MotionEvent.ACTION_UP&&motionPosition == INVALID_POSITION){
- super.onTouchEvent(ev);
- return onTouchInvalidPositionListener.onTouchInvalidPosition(motionPosition);
- }
- }
- return super.onTouchEvent(ev);
- }
- public void setOnTouchInvalidPositionListener(
- OnTouchInvalidPositionListener onTouchInvalidPositionListener) {
- this.onTouchInvalidPositionListener = onTouchInvalidPositionListener;
- }
- public interface OnTouchInvalidPositionListener{
- public boolean onTouchInvalidPosition(int motionEvent);
- }
- }
主要就是這三個問題,當時我是沒有解決,現在算是解決了吧,也希望能幫到正遇到這個問題你。