我创建了自定义列表视图,在一个列表中有2个图像(左、右)和中间的一个文本。当用户单击image1时,将调用activity 1,用户单击image2,将调用ctivity 2,当用户单击与该位置对应的文本activity 3时将调用activity3。有人能告诉我怎么做吗?
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(row, null);
holder = new ViewHolder();
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
if ((items == null) || ((position + 1) > items.size()))
return view;
objBean = items.get(position);
ImageView img = (ImageView)convertView.findViewById(R.id.contact_photo);
img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String phoneNumber = objBean.getPhoneNo();
Intent intent = new Intent(Intent.ACTION_CALL, Uri
.parse(phoneNumber));
con.startActivity(intent);
}
});
holder.tvname = (TextView) view.findViewById(R.id.tvname);
holder.tvPhoneNo = (TextView) view.findViewById(R.id.tvphone);
if (holder.tvname != null && null != objBean.getName()
&& objBean.getName().trim().length() > 0) {
holder.tvname.setText(Html.fromHtml(objBean.getName()));
}
if (holder.tvPhoneNo != null && null != objBean.getPhoneNo()
&& objBean.getPhoneNo().trim().length() > 0) {
holder.tvPhoneNo.setText(Html.fromHtml(objBean.getPhoneNo()));
}
return view;
}
public class ViewHolder {
public TextView tvname, tvPhoneNo;
}
您可以在getView方法中初始化自定义视图组件,并在那里定义setOnClickLisner。
您必须在适配器的getView方法中为textView和imageViews实现OnClickListener:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// CLICK LISTENERS
}
首先,在XML中将图像视图和文本视图的clickable属性都设置为true。
android:clickable="true"
现在有很多方法可以启动您各自的活动。
1) 你可以在你的活动中纠正三种不同的方法,并在点击resp时调用它们。视图。但是,在执行此操作时,您必须在活动中编写这些方法,如果您正在使用fragment,请在主活动中编写它。
android:onClick="your method name"
2) 在getView方法中,为所有三个视图单击Listeners并执行resp。
3) 实现OnClickListener,根据id可以管理您的点击侦听器。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
MyHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_image, parent, false);
holder = new MyViewHolder();
convertView.setTag(holder);
}else {
holder = (MyViewHolder)convertView.getTag();
}
holder. b1 = (Button)convertView.findViewByID(R.id.b1);
holder. b2 = (Button)convertView.findViewByID(R.id.b2);
holder. tv = (TextView)convertView.findViewByID(R.id.tv);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//write intent to go to activity 1
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//write intent to go to activity 2
}
});
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//write intent to go to activity 3
}
});
return convertView;
}
class MyViewHolder{
public TextView tv;
public Button b1, b2;
}
希望这对你有所帮助。。。。
我也有同样的问题,我正在努力解决这个问题。我个人认为列表视图的androids API很糟糕,应该改进它,以便它易于使用和实现。我认为在override get view
方法中调用侦听器是个坏主意,因为由于性能原因,您不能总是相信android系统会向您返回您请求的确切视图。我为列表视图的开发人员报价。使用View Holder静态类只会帮助保存视图并更快地访问它们,但它无助于处理列表视图项目中特定项目视图的事件侦听器,老实说,我在互联网或谷歌开发者网站上没有看到任何合理的解决方案。
好吧,经过两个晚上的绞尽脑汁和无休止的测试,我终于找到了解决方案。
使用setTag
和ViewHolder
实现,但只是不同,将ViewHolder静态实现转换为View我的意思是这个
static class ViewHolder extends View implements OnClickListener {
public ViewHolder(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
ImageView bomb;
public void assignList(){
if(bomb != null)
bomb.setOnClickListener(this);
}
public int position = -1;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("HOMEADAPTER", "OUR OWN STUFF");
}
}
一旦你在你的活动中做到了这一点,你就可以实现你的OnItemClickListener
你所需要做的就是得到你设置的标签,就像一样
ViewHolder holder = (ViewHolder) view.getTag();
那都是宝贝!你已经完成了90%——最后10%你需要做的是你想用你得到的观点做什么。