2016-05-08 3 views
1

Вот тестовый проект, который показывает связь вопрос: идентификации контента https://www.dropbox.com/sh/8s3v9ydcj6jvpl8/AACZ2VRP2N9R1ec7pxrsAn0ga?dl=0Android CardView с ListView внутри - onTouchListener на CardView не работает

У меня есть cardview с ListView внутри. Мне также понадобится элемент click в представлении списка, и я хочу, чтобы вы могли перемещать весь вид карты с помощью ontouchlistener. Я установил onTouchListener на карту, но он не работает.

Код:

Поместите это в build.gradle:

compile 'com.android.support:cardview-v7:22.0+' 

MainActivity:

package com.XXXXXXXX.testontouch; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.CardView; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    private ListView mylistview; 
    private CardView mycardview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mycardview = (CardView)findViewById(R.id.mycardview); 
     mylistview = (ListView) findViewById(R.id.myListView); 

     List<String> your_array_list = new ArrayList<String>(); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 
     your_array_list.add("foo"); 
     your_array_list.add("bar"); 


     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
       this, 
       android.R.layout.simple_list_item_1, 
       your_array_list); 

     mylistview.setAdapter(arrayAdapter); 
     mycardview.setCardElevation(20); 
     mycardview.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       System.out.println("TOuchedddd"); 
       return true; 
      } 
     }); 

    } 
} 

The TOuchedddd никогда не печатает. Если я удалю ListView из карты, то он начнет работать.

Итак, как-то ListView потребляет события касания, а не родительский кард.

XML для MainActivity:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.pranapps.testontouch.MainActivity"> 



<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:id="@+id/mycardview" 
    card_view:cardUseCompatPadding="true"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/myListView" 
     android:dividerHeight="0.2dp" 
     android:overScrollMode="always" 
     android:smoothScrollbar="true" 
     android:groupIndicator="@null" 
     ></ListView> 


</android.support.v7.widget.CardView> 

</RelativeLayout> 

Я попробовал и истинный и ложные для андроида: интерактивный, андроид: фокусируемый и Android: focusableInTouchMode. не повезло.

Пожалуйста, помогите с предложениями попробовать! Спасибо!

РЕДАКТИРОВАТЬ: Перед тем, как спустить, пожалуйста, по крайней мере, оставьте комментарий к вопросу о том, почему вы забрасываете.

+0

Вы хотите щелкнуть элемент в виде списка? –

+0

Да, мне понадобится элемент click в виде списка, и я хочу, чтобы вы могли перемещать весь вид карты с помощью ontouchlistener. –

+0

Вы можете попробовать использовать футляр для «события MotionEvent»: switch (event.getAction()) {case MotionEvent.ACTION_DOWN: ......... –

ответ

3

В Android, события касания пузырятся от ребенка к родителям, как и следовало ожидать. Тем не менее, родитель может выбрать перехват всех событий касания, предназначенных для одного из своих детей, и принять решение наложить вето на отправку события ребенку. Это именно то, что вы хотите, если я правильно понимаю, ваше сенсорное событие должно быть вызвано тем, что происходит, когда вы касаетесь карты, а затем при необходимости отправляете событие касания в список ваших детей.

Для перехвата сенсорного события из CardView, вам нужно создать пользовательский вид, что подкласс и переопределить onInterceptTouchEvent метод:

package com.pranapps.testontouch; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.support.v7.widget.CardView; 
import android.view.MotionEvent; 
import android.view.View; 

public class CardViewTouchThief extends CardView { 

    public CardViewTouchThief(Context context) { 
     super(context); 
    } 
    public CardViewTouchThief(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public CardViewTouchThief(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     /* 
     * This method determines whether we want to intercept the motion. 
     * If we return true, onTouchEvent will be called. 
     */ 
     return true; 
    } 

} 

Затем вы используете CardViewTouchThief, где вы обычно используете ваш CardView в вашем XML расположение:

<com.pranapps.testontouch.CardViewTouchThief 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:layout_gravity="center" 
android:layout_width="match_parent" 
android:layout_height="200dp" 
android:id="@+id/mycardview" 
card_view:cardUseCompatPadding="true"> 

    <ListView 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/myListView" 
    android:dividerHeight="0.2dp" 
    android:overScrollMode="always" 
    android:smoothScrollbar="true" 
    android:groupIndicator="@null"/> 

</com.pranapps.testontouch.CardViewTouchThief> 

А в вашей деятельности поместить свою собственную логику для обработки всякий раз, когда вы хотите, сенсорный событие будет отправлен на ListView.

mycardview.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      Log.d("MainActivity", "TOuchedddd"); 
      if(mylistview!=null){ 
       //Route all touch event to listview without logic 
       mylistview.onTouchEvent(event); 
      } 
      return true; 
     } 
    }); 

Here - это исходный код фиксированного проекта.

+0

спасибо столько человек !!!! ВАМ МА СУПЕР ГЕРО !!!! Это работало совершенно потрясающе! Надеюсь, остальная часть моего андроидского путешествия идет хорошо, еще раз спасибо! –

+0

Я награду за награду за 21 час –

+0

Рад помочь вам! – Gomino

Смежные вопросы