ListView с горизонтальным ScrollView OnItemClick не работает - PullRequest
6 голосов
/ 29 января 2012

Очень быстро, у меня есть listView с пользовательским адаптером, и он надувает представление, которое содержит HorizontalScrollView, а также просмотр текста и т. Д. У меня проблема в том, что когда я пытаюсь присоединить слушателя к этому listView, это не так.получение любых обратных вызовов.

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

код ... (мой список элементов xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearMain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/grey" >

        <TextView
            android:id="@+id/headerName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:padding="4dp"
            android:textColor="@color/text_header"
            android:textStyle="bold"
            android:text="TextView" />

    </RelativeLayout>
    <View
        android:background="@color/border"
        android:layout_width="fill_parent"
        android:layout_height="1px" />
    <HorizontalScrollView
        android:id="@+id/horizontalScrollView1"
        android:layout_width="fill_parent"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/linearImages"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" 
            android:padding="4dp">
        </LinearLayout>
    </HorizontalScrollView>
    <View
        android:background="@color/border"
        android:layout_width="fill_parent"
        android:layout_height="1px" />
</LinearLayout>

, а затем в моем onCreate ...

lv.setAdapter(myobj.adapter);
    lv.setTextFilterEnabled(true);
    lv.setOnItemClickListener(new OnItemClickListener(){

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            Log.w("dsdsds", "sdsdsds");
        }});

Любая помощь или предложения будут с благодарностью

Ответы [ 4 ]

3 голосов
/ 10 мая 2015

Добавьте это в самый верхний макет:

android:descendantFocusability="blocksDescendants"

Это помогло мне, теперь запускается onItemClickListener.

1 голос
/ 09 октября 2013

для ScrollView вы должны использовать OnTouchListener, например:

private class ScrollViewOnTouchListener   implements OnTouchListener{
        HorizontalScrollView view;
        float historicX = Float.NaN;
        static final int DELTA_ON_CLICK = 20;
        long historicTime;
        int position;
        public ScrollViewOnTouchListener(HorizontalScrollView view, int position){
            this.view = view;
            this.position = position;
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
            switch (event.getAction()) 
            {
                case MotionEvent.ACTION_DOWN:
                historicX = event.getX();
                historicTime = System.currentTimeMillis();
                break;

                case MotionEvent.ACTION_UP:

                if (Math.abs(event.getX() - historicX) < DELTA_ON_CLICK)
                    // seems like onclick
                    // do what you want for onClick

                break;
                default: return false;
            }
            return true;
        }


    }

и в методе getView адаптера:

public View getView(int position, View convertView, ViewGroup parent) {
    ...
  HorizontalScrollView scrollItem;
  scrollItem =(  HorizontalScrollView )itemView.findViewById(R.id.item_scroll_view);
  scrollItem .setOnTouchListener(new  ScrollViewOnTouchListener(scrollItem , position));       
} 
1 голос
/ 30 января 2012

Вы можете вызвать setOnClickListener для linearMain в методе getView () вашего адаптера.

0 голосов
/ 27 апреля 2017

Внутри list_item.xml пометьте свой макет с каким-нибудь идентификатором:

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView 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:fillViewport="true">

    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

...

Откройте свой пользовательский адаптер, в getView(...) введите:

layout = view.findViewById(R.id.layout);
layout.setTag(position);
layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (callback != null) {
                callback.showItem(getItem((int) v.getTag()));
            }
        }
    });

Ниже в адаптере введите:

public interface OnClickInterface {
    void showItem(YourClass item);
}

И в конструкторе адаптера назначьте обратный вызов:

public CustomAdapter(Context context, List<YourClass> list, OnClickInterface callback, int resId) {
    this.callback = callback;
    ...

В вашем упражнении / фрагменте, который содержит ListView, создайте адаптер следующим образом:

CustomAdapter.OnClickInterface callback = new CustomAdapter.OnClickInterface() {
        @Override
        public void showItem(YourClass item) {
            // Do something with an item.
        }
}
adapter = new Customdapter(getActivity(), new ArrayList<YourClass>(), callback, R.layout.list_item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...