Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android listview長按,單擊各種事件捕捉

android listview長按,單擊各種事件捕捉

編輯:關於Android編程

之前一直想總結一下這樣知識,後面各種忙,就不想寫。還是自已總結一下比較好。listview需要注意事項有很多吧,也是最常用的控件之一。我們可以自動計算listview的高度,當與滾動條一起使用的時候。listview分隔線也可以去掉,或者更改。還有與各種控件一起使用的監聽。接下來看看我所介紹的以及效果圖。

 

一、看項目主要類

 

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 getDataSource() {
		ArrayList list = new ArrayList();
		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

 

這裡的xml還用到浮動的FrameLayout,用來顯示button鍵。

 


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

 




    

        

        

    


這裡說明一下,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一起使用。

     

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved