天天看點

listview當條目中有按鈕的點選事件

1.對item中的點選事件,可以定義接口來監聽,先寫一個接口類

package com.example.listviewbuttonclick.adapter.inter;

import android.view.View;

public interface InterClick {
	public void commentClick(View v);
	public void shareClick(View v);
	public void animClick(View v);
}
           

2.listview的擴充卡adapter類;

package com.example.listviewbuttonclick.adapter;

import java.util.List;

import com.example.listviewbuttonclick.R;
import com.example.listviewbuttonclick.adapter.inter.InterClick;

import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ContentAdapter extends BaseAdapter implements OnClickListener {

	private static final String TAG = "ContentAdapter";
	private List<String> mContentList;
	private LayoutInflater mInflater;
	private InterClick mCallback;
	private boolean isplaying;
	private boolean isSameItem;
	private int mPosition;

	public ContentAdapter(Context context, List<String> contentList,
<span style="white-space:pre">			</span>boolean isplaying, boolean isSameItem, int mPosition, InterClick callback) {
<span style="white-space:pre">		</span>this.mContentList = contentList;
<span style="white-space:pre">		</span>this.mInflater = LayoutInflater.from(context);
<span style="white-space:pre">		</span>this.mCallback = callback;
<span style="white-space:pre">		</span>this.isplaying = isplaying;
<span style="white-space:pre">		</span>this.isSameItem = isSameItem;
<span style="white-space:pre">		</span>this.mPosition = mPosition;
<span style="white-space:pre">	</span>}

	@Override
	public int getCount() {
		Log.i(TAG, "getCount");
		return mContentList.size();
	}

	@Override
	public Object getItem(int position) {
		Log.i(TAG, "getItem");
		return mContentList.get(position);
	}

	@Override
	public long getItemId(int position) {
		Log.i(TAG, "getItemId");
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.i(TAG, "getView");
		ViewHolder holder = null;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.list_item, null);
			holder = new ViewHolder();
			holder.textView = (TextView) convertView.findViewById(R.id.textView1);
			holder.button1 = (Button) convertView.findViewById(R.id.button1);
			holder.button2 = (Button) convertView.findViewById(R.id.button2);
			holder.ll_voice_play = (LinearLayout) convertView.findViewById(R.id.ll_voice_play);
			holder.iv_voice_image_anim = (ImageView) convertView.findViewById(R.id.iv_voice_image_anim);
			holder.iv_voice_image = (ImageView) convertView.findViewById(R.id.iv_voice_image);

			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		AnimationDrawable animationDrawable = (AnimationDrawable) holder.iv_voice_image_anim.getBackground();
		
		if (position == mPosition) {
			System.out.println("點選的條目======"+position);
			if (isSameItem) {
				if (isplaying) {
					holder.iv_voice_image.setVisibility(View.GONE);
					holder.iv_voice_image_anim.setVisibility(View.VISIBLE);
					animationDrawable.start();
				} else {
					holder.iv_voice_image_anim.setVisibility(View.GONE);
					holder.iv_voice_image.setVisibility(View.VISIBLE);
					animationDrawable.stop();
				}
			}else {
				animationDrawable.start();
				holder.iv_voice_image_anim.setVisibility(View.VISIBLE);
				holder.iv_voice_image.setVisibility(View.GONE);
			}
			
		}else {
			System.out.println("其它條目--------"+position);
			animationDrawable.stop();
			holder.iv_voice_image_anim.setVisibility(View.GONE);
			holder.iv_voice_image.setVisibility(View.VISIBLE);
		}
		
		holder.textView.setText(mContentList.get(position));
		holder.button1.setOnClickListener(this);
		holder.button2.setOnClickListener(this);
		holder.ll_voice_play.setOnClickListener(this);

		// 設定位置,擷取點選的條目按鈕
		holder.button1.setTag(position);
		holder.button2.setTag(position);
		holder.ll_voice_play.setTag(position);
		
		return convertView;
	}

	public class ViewHolder {
		public TextView textView;
		public Button button1;
		public Button button2;
		public LinearLayout ll_voice_play;
		public ImageView iv_voice_image_anim;
		public ImageView iv_voice_image;
	}

	// 響應按鈕點選事件,調用子定義接口,并傳入View
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			mCallback.commentClick(v);
			break;
		case R.id.button2:
			mCallback.shareClick(v);
			break;
		case R.id.ll_voice_play:
			mCallback.animClick(v);
			break;
		default:
			break;
		}
	}
	public void refreshPersonContactsAdapter(int mPosition, boolean isplaying, boolean isSameItem) { 
		this.mPosition = mPosition;
		this.isplaying = isplaying;
		this.isSameItem = isSameItem;
        notifyDataSetChanged(); 
    }
}
           

在條目的布局中定義了兩個按鈕,和一個可點選的布局來播放幀動畫。

條目的布局檔案:

<?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="wrap_content"
	android:descendantFocusability="blocksDescendants"
	android:orientation="vertical" >

	<TextView
		android:id="@+id/textView1"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="content"
		android:textColor="#ff0000"
		android:textSize="20sp" />

	<LinearLayout
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:orientation="horizontal" >

		<Button
			android:id="@+id/button1"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:focusable="false"
			android:text="評論"
			android:textColor="#ff0000"
			android:textSize="20sp" />

		<Button
			android:id="@+id/button2"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:focusable="false"
			android:text="分享"
			android:textColor="#ff0000"
			android:textSize="20sp" />
		
		<LinearLayout
            android:id="@+id/ll_voice_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tv_member_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="張星星"
                android:textColor="#a0a0a0"
                android:textSize="14dp"
                android:textStyle="normal" />

            <RelativeLayout
            android:id="@+id/rl_voice_play"
            android:visibility="visible"
            android:layout_width="80dp"
            android:layout_height="34dp"
            android:focusable="false"
            android:background="@drawable/selector_voice_history_bg"
            >

        <ImageView
                android:id="@+id/iv_voice_image_anim"
                android:layout_width="15dp"
                android:layout_height="20dp"
                android:background="@anim/voice_history_play_anim"
                android:layout_centerVertical="true"
                android:layout_marginLeft="18dp"
                android:visibility="gone"
                />

        <ImageView
            android:id="@+id/iv_voice_image"
            android:layout_width="15dp"
            android:layout_height="20dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="18dp"
            android:background="@drawable/sound_item"
            android:visibility="visible" />

    </RelativeLayout>
            
        </LinearLayout>
	</LinearLayout>

</LinearLayout>
           

3.在頁面中為listview設定adapter即可;

package com.example.listviewbuttonclick;

import java.util.ArrayList;

import java.util.List;

import com.example.listviewbuttonclick.adapter.ContentAdapter;
import com.example.listviewbuttonclick.adapter.inter.InterClick;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

//MainActivity需要實作自定義接口
public class MainActivity extends Activity implements OnItemClickListener
		{

	// 模拟listview中加載的資料
	private static final String[] CONTENTS = { "北京", "上海", "廣州", "深圳", "蘇州",
			"南京", "武漢", "長沙", "杭州" };
	private List<String> contentList;
	private ListView mListView;
	private boolean isplaying;
	private boolean isSameItem;
	private int mPosition = -1;
	private int lastPosition = -1;
	private ContentAdapter contentAdapter;

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

		init();
	}

	private void init() {
		mListView = (ListView) findViewById(R.id.listview);
		contentList = new ArrayList<String>();
		for (int i = 0; i < CONTENTS.length; i++) {
			contentList.add(CONTENTS[i]);
		}
		contentAdapter = new ContentAdapter(this, contentList, interClick);
		mListView.setAdapter(contentAdapter);
		mListView.setOnItemClickListener(this);
	}

	/**
	 * 響應ListView的條目點選事件
	 */
	@Override
	public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
		Toast.makeText(this, "點選的條目位置是-->" + position, Toast.LENGTH_SHORT).show();
	}

	private InterClick interClick = new InterClick() {
	
	/**
	 * 接口方法,響應ListView按鈕點選事件
	 */

	@Override
	public void commentClick(View v) {
		Toast.makeText(
				MainActivity.this,
				"listview的内部的評論按鈕被點選了!,位置是-->" + (Integer) v.getTag()
						+ ",内容是-->" + contentList.get((Integer) v.getTag()),
				Toast.LENGTH_SHORT).show();
	}

	@Override
	public void shareClick(View v) {
		Toast.makeText(
				MainActivity.this,
				"listview的内部的分享按鈕被點選了!,位置是-->" + (Integer) v.getTag()
						+ ",内容是-->" + contentList.get((Integer) v.getTag()),
				Toast.LENGTH_SHORT).show();
	}

	@Override
	public void animClick(View v) {
		mPosition = (Integer) v.getTag();
		if (lastPosition == mPosition) {
			isSameItem = true;
			isplaying = !isplaying;
		} else {
			isSameItem = false;
			isplaying = true;
		}
		contentAdapter.refreshPersonContactsAdapter(mPosition, isplaying, isSameItem);
		lastPosition = mPosition;
	}
	};
	
	

}
           

這裡面向adapter傳遞了幾個值,來控制幀動畫的播放和暫停。

參考與:http://blog.csdn.net/waniu123/article/details/49532451