安卓大神告诉我怎么让ListView自身的点击事件 5C

安卓大神告诉我怎么让ListView的点击事件(不是item的点击事件,屏蔽掉item的点击事件,就点击ListView本身)和上下滑动事件共存。

9个回答

有这样需求啊,好说,一个简单的重写就能解决问题。
继承ListView
图片说明
使用的时候
图片说明

图片说明
这是 ListView 调用的setOnClickListener的源码,直接就抛异常了,所以自定义类重写setOnClickListener的时候就不要调用super的了。

跟你说个简单的
把ListView 中 item 的点击动画给取消了并且不要让 item 中的控件能够获得焦点拦截点击事件
然后将onItemClickListener当作onClickListener处理就好了。效果妥妥的!!
图片说明

talent_wjd
寒平洛一 而且直接写listView.setOnClickListener是不行的,运行报错, Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead at android.widget.AdapterView.setOnClickListener(AdapterView.java:783)
3 年多之前 回复
talent_wjd
寒平洛一 怎样“不要让 item 中的控件能够获得焦点并拦截点击事件”
3 年多之前 回复

不行的,运行报错, Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
at android.widget.AdapterView.setOnClickListener(AdapterView.java:783)

你理解错我的意思了,不要用 setOnClickListener
图片说明
这是一个比较取巧的行为

item 中如果有 Button,EditText这些可以获得焦点的控件的话,你点击Item 的时候点击事件会被拦截掉,也就不会调用onItemClick了
为了不让获得焦点可以这样做:(蓝色选中的内容)
图片说明

talent_wjd
寒平洛一 需求是ListView数据哪怕只要一条,点击也能触发制定的事件,如果用setOnItemClickLinstener,只有一条数据的时候就只能点击最上面实现(我的ListView的高度是充满或者一个给定的高度)
3 年多之前 回复
talent_wjd
寒平洛一 这样我知道,但是不行,应为listView其坐在布局里高度是充满的,而数据有时候只有一条,那么点击的时时候只能点击最上面item了,需求是点击ListView都行
3 年多之前 回复

事件分发的处理,在listview的dispachTouchEvent中直接return true;

talent_wjd
寒平洛一 试过了,不起作用
3 年多之前 回复

我可以问一下,你这么做的目的何在吗?为何会有这种奇怪的需求?
既然你都知道源码中写了,抛出的异常信息的意思是,“不要试图给AdapterView及其子类添加OnClickListener”,这说明谷歌官方都不允许你这么做。

如果你觉得我说的不对,那么你无视这条回复好了

请参考:

package com.wps.android;

import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class Layouts extends Activity {
/** Called when the activity is first created. */
private ListView mylistview;
private ArrayList list = new ArrayList();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mylistview = (ListView)findViewById(R.id.listview);
list.add("LinearLayout");
list.add("AbsoluteLayout");
list.add("TableLayout");
list.add("RelativeLayout");
list.add("FrameLayout");
ArrayAdapter myArrayAdapter = new ArrayAdapter
(this,android.R.layout.simple_list_item_1,list);
mylistview.setAdapter(myArrayAdapter);
/*mylistview.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {
                mylistview.setBackgroundColor(Color.BLUE);
            }
            return false;
        }

    });*/
    mylistview.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            if(list.get(arg2).equals("LinearLayout"))
            {
                Intent intent = new Intent("com.wps.android.LINEARLAYOUT");
                startActivity(intent);
            }
            if(list.get(arg2).equals("AbsoluteLayout"))
            {
                Intent intent = new Intent("com.wps.android.ABSOLUTELAYOUT");
                startActivity(intent);
            }
            if(list.get(arg2).equals("TableLayout"))
            {
                Intent intent = new Intent("com.wps.android.TABLELAYOUT");
                startActivity(intent);
            }
            if(list.get(arg2).equals("RelativeLayout"))
            {
                Intent intent = new Intent("com.wps.android.RELATIVELAYOUT");
                startActivity(intent);
            }
            if(list.get(arg2).equals("FrameLayout"))
            {
                Intent intent = new Intent("com.wps.android.FRAMELAYOUT");
                startActivity(intent);
            }
        }

    });
}

}


重写ListVIew组件,然后在滑动事件中判断移动距离,再来判断是滑动还是点击

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问