這個是我在csdn裡面寫的第一篇文章,再加上我剛參加工作不久,是一個真真的新手,所以還望大家多多指導。
這裡要分享的是在一個listview中添加兩個點擊事件的解決辦法,效果就像android qq的好友名單中,點擊一個好友,會進入聊天介面,點擊後面的表徵圖,就會進入好友詳細資料介面。這樣的好處就是既不去掉ListView的OnItemClick事件,而且又添加了一個新的事件。
接下來是如何?了,首先需要一個自訂的view,我選擇的是定義一個LinearLayout的子類,叫ClickIcon
ClickIcon.java
package com.hhg.test.listview2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
public class ClickIcon extends LinearLayout {
public ClickIcon(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setPressed(boolean pressed) {
if (pressed && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
然後把這個自訂的view寫到ListView的Adapter的布局檔案中。
list_view_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:orientation="horizontal">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Photo">
</ImageView>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Name"
android:layout_marginLeft="20dip">
</TextView>
<com.hhg.test.listview2.ClickIcon
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ClickIconLayout"
android:layout_marginLeft="50dip">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"
android:id="@+id/img">
</ImageView>
</com.hhg.test.listview2.ClickIcon>
</LinearLayout>
然後在是ListView的Adapter,我是用BaseAdapter的子類。在getView方法中為每一個ClickIcon添加點擊事件。
MyAdapter.java
package com.hhg.test.listview2;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Dog> dogs;
public MyAdapter(Context context, List<Dog> dogs) {
this.context = context;
this.dogs = dogs;
}
@Override
public int getCount() {
return dogs.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) LayoutInflater.from(context);
ViewHolder vh = null;
if (convertView == null) {
vh = new ViewHolder();
convertView = inflater.inflate(R.layout.list_view_item, null);
vh.photo = (ImageView) convertView.findViewById(R.id.Photo);
vh.name = (TextView) convertView.findViewById(R.id.Name);
vh.clickIcon = (ClickIcon) convertView
.findViewById(R.id.ClickIconLayout);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
Dog d = dogs.get(position);
vh.photo.setImageResource(d.getImgId());
vh.name.setText(d.getName());
vh.clickIcon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "Icon clicked, position is:" + position,
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
private static class ViewHolder {
ImageView photo;
TextView name;
ClickIcon clickIcon;
}
}
為了省事,我用一個Toast提示那個部分被點擊。
接下來是在Activity中產生ListView,設定Adapter,添加OnItemClick事件。
MainActivity.java
package com.hhg.test.listview2;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lv = (ListView) findViewById(R.id.TestListView);
MyAdapter adapter = new MyAdapter(this, getDogs());
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(MainActivity.this, "Item clicked, position is:" + arg2,
Toast.LENGTH_SHORT).show();
}
});
}
private List<Dog> getDogs() {
List<Dog> dogs = new ArrayList<Dog>();
ApplicationInfo appInfo = getApplicationInfo();
final String packageName = appInfo.packageName;
for (int i = 0; i < 8; i++) {
Dog d = new Dog();
d.setName("Dog No." + i);
d.setImgId(getResources().getIdentifier("sample_thumb_" + i,
"drawable", packageName));
dogs.add(d);
}
return dogs;
}
}
這裡用到了一個Dog類,主要是用來組合圖片和文字,圖片資源在ApiDemos裡面可以找到。
Dog.java
package com.hhg.test.listview2;
public class Dog {
private int id;
private String name;
private int imgId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImgId() {
return imgId;
}
public void setImgId(int imgId) {
this.imgId = imgId;
}
}
好了接下來貼圖看效果。
當我們點擊一個Icon時,提示Icon被點擊,位置是多少。
然後當我們點擊一個ListItem時,提示Item被點擊,位置是多少。
提示,如果吧LinearLayout的子類換成button的任何子類,如果丟掉了OnItemClicked事件,我就不知道啥原因了。
謝謝您的閱讀。
若水飛天