2016-10-16 1 views
0

У меня есть listview с пользовательским заголовком класса, который является полностью прозрачным. За видом списка у меня есть mapview, который отображается через прозрачный заголовок.андроид listview заголовок проходит через touch для просмотра за

Я пытаюсь сделать эту работу так, чтобы, если пользователь прокручивает мое касание любой из строк в списке, то свиток listview. Но если пользователь прикасается к верхней прозрачной части заголовка списка, то listview не должен перехватывать штрихи и вместо этого передавать его в mapview сзади (что позволяет пользователю панорамировать/увеличивать изображение на карте).

Я не могу добиться этого в настоящее время, так как список продолжает красть все время. Любая помощь будет оценена по достоинству.

ответ

0

nvm, я нашел решение по аналогичному вопросу. Не знаю, почему я не нашел его, прежде чем публиковать этот вопрос, но потом, SO показал его мне в связанных вопросах справа.

Решение: how to make header of listview not to consume the touch event

Используйте пользовательский класс ListView:

package xxx.xxx.xxxxxx; 

import android.content.Context; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.ListView; 

public class HeaderUntouchableListView extends ListView { 
    private View mHeaderView; 
    private boolean isDownEventConsumed; 

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

    @Override 
    public void addHeaderView(View v) { 
     super.addHeaderView(v); 
     this.mHeaderView = v; 
    } 

    @Override 
    public void addHeaderView(View v, Object data, boolean isSelectable) { 
     super.addHeaderView(v, data, isSelectable); 
     this.mHeaderView = v; 
    } 

    /** 
    * list header should not consume the event, and list item should consume the event 
    * consumed here is replaced with super.dispatchTouchEvent(motionEvent) 
    * @param motionEvent 
    * @return is event consumed 
    */ 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent motionEvent) { 
     if(mHeaderView == null) return super.dispatchTouchEvent(motionEvent); 
     if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ 
      //if touch header not to consume the event 
      Rect rect = new Rect((int) mHeaderView.getX(), (int) mHeaderView.getY(), mHeaderView.getRight(), mHeaderView.getBottom()); 
      if(rect.contains((int)motionEvent.getX(), (int)motionEvent.getY())){ 
       isDownEventConsumed = false; 
       return isDownEventConsumed; 
      }else { 
       isDownEventConsumed = true; 
       return super.dispatchTouchEvent(motionEvent); 
      } 
     }else{ 
      //if touch event not consumed, then move/up event should be the same 
      if(!isDownEventConsumed)return isDownEventConsumed; 
      return super.dispatchTouchEvent(motionEvent); 
     } 
    } 
} 
Смежные вопросы