HorizontalScrollView внутри ListView: небольшая вертикальная прокрутка останавливает горизонтальную прокрутку - PullRequest
5 голосов
/ 07 ноября 2011

В моем примере активности у меня есть
- ListView, содержащий
- несколько HorizontalScrollView, содержащие
- набор TextView

Горизонтальная прокрутка довольно плоха.
Когда я запускаю горизонтальную прокрутку (или бросание), я должен быть очень осторожным, чтобы она заработала.

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

Любое предложение о том, как улучшить это?

Заранее спасибо,

Марк

import android.app.Activity;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Test extends Activity 
{
private final static int N = 20;//number of HorizontalScrollView
private final static int M = 20;//number of TextViews inside a single HorizontalScrollView


@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    LinearLayout layout = new LinearLayout(this);
    //create a list of HorizontalScrollViews
    final HorizontalScrollView[] hors = new HorizontalScrollView[N];
    for (int i = 0; i < hors.length; i++)
    {
        hors[i] = new HorizontalScrollView(this, null);
        hors[i].setMinimumHeight(60);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        hors[i].addView(ll);
        for (int j = 0; j < M; j++)
        {
            TextView t = new TextView(Test.this);
            t.setText("HorizontalScrollView: "+i+"; TextView: "+j);
            t.setMinimumHeight(40);
            ll.addView(t);
        }
    }
    //add a ListView
    ListView list = new ListView(this);
    layout.addView(list);
    list.setAdapter(new BaseAdapter()
    {

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            return hors[position];
        }

        @Override
        public long getItemId(int position)
        {
            return 0;
        }

        @Override
        public Object getItem(int position)
        {
            return hors[position];
        }

        @Override
        public int getCount()
        {
            return N;
        }
    });

    setContentView(layout);

}


}

Ответы [ 4 ]

5 голосов
/ 09 декабря 2011

Проблема в том, что ListView (или, точнее, его родитель AbsListView) реализует onInterceptTouchEvent, и, следовательно, ListView может перехватывать все события касания, как только считает, что он в лучшем положении для их обработки. *

Этого можно избежать, позвонив по номеру requestDisallowInterceptTouchEvent, например, путем подкласса HorizontalScrollView и в его dispatchTouchEvent:

public boolean dispatchTouchEvent(MotionEvent ev)
{
  boolean ret = super.dispatchTouchEvent(ev);
  if(ret) 
  {
    requestDisallowInterceptTouchEvent(true);
  }
  return ret;
}       

Он нуждается в некотором уточнении (как, например, вызовите requestDisallowInterceptTouchEvent, если горизонтальный компонент больше, чем вертикальный), поскольку теперь он едва ли позволяет ListView получить контроль.

1 голос
/ 07 ноября 2011

, хотя я не копался в вашем коде, но общая ошибка, которую делают люди, это вставка listView внутри ScrollView.

, поскольку просмотр списка автоматически прокручивается, поэтому держите его вне scrollView, в то время как другие элементы могут быть в scrollView.

проверьте, если это сценарий, иначе поделитесь XML Layout

0 голосов
/ 20 мая 2015

Лучший способ сделать это.

Поместить данный код в ваш горизонтальный просмотр списка методом Scroll, чтобы он работал идеально

0 голосов
/ 29 октября 2014

Android имеет концепцию, называемую сенсорный отстой.Вот на подобный вопрос уже ответили: Android ACTION_MOVE Threshold

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...