如何在自定义列表视图上实现点击监听器



我创建了自定义列表视图,在一个列表中有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静态类只会帮助保存视图并更快地访问它们,但它无助于处理列表视图项目中特定项目视图的事件侦听器,老实说,我在互联网或谷歌开发者网站上没有看到任何合理的解决方案。

好吧,经过两个晚上的绞尽脑汁和无休止的测试,我终于找到了解决方案。

使用setTagViewHolder实现,但只是不同,将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%你需要做的是你想用你得到的观点做什么。

相关内容

  • 没有找到相关文章

最新更新