android listview长按,单击各种事件捕捉

之前一直想总结一下这样知识,后面各种忙,就不想写。还是自已总结一下比较好。listview需要注意事项有很多吧,也是最常用的控件之一。我们可以自动计算listview的高度,当与滚动条一起使用的时候。listview分隔线也可以去掉,或者更改。还有与各种控件一起使用的监听。接下来看看我所介绍的以及效果图。

本文项目demo地址:点击此处下载

一、看项目主要类

package com.example.customlistviewdemo;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;

public class CustomListviewActivity extends Activity implements
		OnClickListener, OnItemLongClickListener {

	private ListView myListView;
	private MyCustomListViewAdapter mCustomListViewAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_custom_listview);

		myListView = (ListView) findViewById(R.id.listView1);
		mCustomListViewAdapter = new MyCustomListViewAdapter(
				getApplicationContext());
		myListView.setOnItemLongClickListener(this); // 长按item监听
		myListView.setAdapter(mCustomListViewAdapter);

		setListViewHeightBasedOnChildren(myListView); // listview自动计算高度
		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(this);
	}

	// listview自动计算高度
	private void setListViewHeightBasedOnChildren(ListView listView) {
		// 获取ListView对应的Adapter
		ListAdapter listAdapter = listView.getAdapter();
		if (listAdapter == null) {
			return;
		}
		int totalHeight = 0;
		for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
			View listItem = listAdapter.getView(i, null, listView);
			listItem.measure(0, 0); // 计算子项View 的宽高
			totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
		}
		ViewGroup.LayoutParams params = listView.getLayoutParams();
		params.height = totalHeight
				+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
		listView.setLayoutParams(params);
	}

	public List<String> getDataSource() {
		ArrayList<String> list = new ArrayList<String>();
		list.add("北京");
		list.add("上海");
		list.add("广州");
		list.add("南京");
		list.add("苏州");
		list.add("江苏");
		list.add("杭州");
		list.add("乌镇");
		list.add("丽江");
		list.add("大理");
		list.add("昆明");
		list.add("哈尔滨");
		return list;
	}

	public class MyCustomListViewAdapter extends BaseAdapter implements
			OnCheckedChangeListener, OnClickListener {
		private Context mContext;
		private LayoutInflater mLayoutInflater;

		public MyCustomListViewAdapter(Context context) {
			mContext = context;
			mLayoutInflater = (LayoutInflater) mContext
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return getDataSource().size();
		}

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

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

		@Override
		public View getView(int position, View arg1, ViewGroup arg2) {
			LinearLayout linearLayout = (LinearLayout) mLayoutInflater.inflate(
					R.layout.layout_custom_checkbox_item, null);
			linearLayout.setOnClickListener(this);
			linearLayout.setTag(position);

			TextView titleTextView = (TextView) linearLayout
					.findViewById(R.id.textView1);

			if (titleTextView != null)
				titleTextView.setText(getDataSource().get(position));

			// 控件 是否选中
			CheckBox selectedCheckBox = (CheckBox) linearLayout
					.findViewById(R.id.checkBox1);
			selectedCheckBox.setOnCheckedChangeListener(this);
			return linearLayout;
		}

		@Override
		public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
			Integer nPosition = (Integer) (arg0.getTag());
			Toast.makeText(getApplication(), "CheckBox选中事件:",
					Toast.LENGTH_SHORT).show();
		}

		@Override
		public void onClick(View arg0) {
			// 单击事件响应
			int position = ((Integer) arg0.getTag()).intValue();
			Toast.makeText(getApplication(),
					"listview单击事件:" + getDataSource().get(position),
					Toast.LENGTH_SHORT).show();
		}

	}

	@Override
	public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
		Toast.makeText(getApplicationContext(), "listview长按事件:",
				Toast.LENGTH_SHORT).show();
		return true;
	}

	@Override
	public void onClick(View arg0) {
		if (arg0.getId() == R.id.button1) {
			Toast.makeText(getApplicationContext(), "button事件:",
					Toast.LENGTH_SHORT).show();
		}
	}

}

大家都知道,listview是可以自已滚动的,但也可以禁止滚动。可能你不需要它滚动。只需要滚动条滚动。我就是遇到过这种需求,listview与滚动条一起使用情况。代码上也有所说明了。

二、下面看看xml

<LinearLayout 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:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.96" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="60dp"
                    android:orientation="vertical" >

                    <TextView
                        android:id="@+id/textView1"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="自定义listview样式"
                        android:textSize="18sp" />
                </LinearLayout>

                <ListView
                    android:id="@+id/listView1"
                    android:layout_width="match_parent"
                    android:layout_height="400dp">

                </ListView>
            </LinearLayout>
        </ScrollView>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_gravity="bottom"
            android:gravity="center"
            android:orientation="vertical" >

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button"
                android:textSize="18sp" />
        </LinearLayout>
    </FrameLayout>

</LinearLayout>

这里的xml还用到浮动的FrameLayout,用来显示button键。

三、下面来看看listview的item的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:longClickable="true"
    android:clickable="true"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
         android:gravity="center" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_weight="1.02"
            android:gravity="center_vertical|left"
            android:paddingLeft="10dp"
            android:textColor="#000"
            android:text="TextView"
            android:textSize="18sp" />

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:paddingRight="10dp"
            android:textColor="#000"
            android:layout_gravity="right" />

    </LinearLayout>

</LinearLayout>

这里说明一下,LinearLayout里需要这两句。分别是listview单击和长按的设置。

   android:longClickable="true"
   android:clickable="true"

四、接下来看看效果图:

五、最后补充一下,去掉listview分隔线或者设置。

去掉分隔线有三种方法:

1、myListView.setDividerHeight(0);

2、myListView.setDivider(null);

  1. 3、XML布局文件中设置ListView的属性android:divider="#FFCC00"或者android:divider="@null"

设置或者换一个好看的自动的分隔线也行

android:divider="@drawable/skin_line"

到这里就结束了,本文中讲的都是监听以及布局,关于listview以及滚动条,checkbox,buuton一起使用。

本文项目demo地址:点击此处下载

时间: 2024-10-07 12:52:00

android listview长按,单击各种事件捕捉的相关文章

Android ListView 长按列表弹出菜单

Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(0, 0, 0, "删除单号"); menu.add

【转】Android ListView长按事件触发点击事件

原文网址:http://blog.csdn.net/twlkyao/article/details/17301609 算法在实现ListView的onItemLongClickListener的时候,发现如果长按item,会造成onItemClickListener也会被触发,这是因为onItemLongClickListener默认返回为false,而返回false会触发onItemClickListener,这时可以通过将onItemLongClickListener返回true解决. [j

Android ListView滑动删除及响应事件详解

目标:实现类似QQ,微信的消息列表滑动删除 具体操作: 1. 主页面布局 首先在布局文件(本例是activity_main.xml)中引入ListView控件,并指定id(如下代码中黑体部分). <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" andr

Android ListView 长按如何获取item的主键并操作对应数据库元组

============问题描述============ 我做的是一个租房管理系统,大概是现在在对房子操作这个界面,我现在是要长按listView中的某一个Item,要求实现修改和删除功能. This is my house_setting.xml document <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

Android listview的item点击事件失效Bug的解决

原因:listview布局中出现了button  .imaageButton.checkBox等可以点击的控件 第一种解决方法:在布局中添加android:descendantFocusability="blocksDescendants" 第二种解决方法:使用其他控件代替,在activity中用setOnClickListener监听点击事件

Android listview的适配器以及各种监听、效率的提升

之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面.但有些方法还是可取,例如灵活的监听,写适配器.链接在这里android listview长按,单击各种事件捕捉.那个单击监听是一项项设置监听,效率也不好. 不断工作的过程,也是不断总结过程.现在对于listview有了更透彻的理解,所以重新写了一个实践demo.这个demo有涉及到listview的数据源,布局,适配器以及各种监听.效率的提升.现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就

Android长按及拖动事件探究

Android中长按拖动还是比较常见的.比如Launcher中的图标拖动及屏幕切换,ListView中item顺序的改变,新闻类App中新闻类别的顺序改变等.下面就这个事件做一下分析. 就目前而言,Android中实现长按事件响应有几种方式,包括: 设置View.OnLongClickListener监听器 通过GestureDetector.OnGestureListener间接获取长按事件 实现View.OnTouchListener,然后在回调中通过MotionEvent判断是否触发了长按

listView长按事件内修改ListView对象内容

============问题描述============ 我在ListView的Item长按事件内打开一个弹出窗口,窗口内有一个EditText对象,在这个编辑框内输入文本点确定后,希望可以直接修改掉ListView对象内某个TextView对象的内容:现在ListView长按事件内直接修改没有问题了,只是弹出一个窗口再修改不知道该如何实现: ============解决方案1============ 引用 楼主 hackerlyf 的回复: 我在ListView的Item长按事件内打开一个弹出

Android学习----------长按列表项弹出菜单,给菜单项添加事件,获取上下文

这里是先显示一个listview,长按listview的一个列表项,弹出一个菜单来,菜单有两个条目, "更新该条"和"删除该条",并且这两条都有监听事件,整体就像微信好友对话操作一样. 其中菜单项有一个获取上下文的操作:AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 这句也是用于列表项的. 具体代码如下: protected void onCreate(Bundle