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