1

我创建了自定义列表视图,在一个列表中有 2 个图像(左、右)和一个文本,当用户单击 image1 时,将调用 activity1 并且用户单击 image2,将调用 activity2 并且当用户单击文本时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;
}
4

5 回答 5

1

您可以在 getView 方法中初始化自定义视图组件,并在那里定义 setOnClickLisner。

于 2014-04-15T11:35:47.217 回答
1

您必须在适配器的 getView 方法中为 textView 和 imageViews 实现 OnClickListener:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // CLICK LISTENERS

}
于 2014-04-15T11:38:52.393 回答
0

首先在 XML 中将图像视图和文本视图的可点击属性设置为 true。

android:clickable="true"

现在有很多方法可以启动各自的活动。

1)您可以在您的活动中正确使用三种不同的方法,并在单击时调用它们。在 XML 本身中查看。但是在执行此操作时,您必须在您的活动中编写这些方法,如果您正在使用片段,请将其写入您的主要活动中。

android:onClick="your method name"

2)在您的 getView 方法中,为所有三个视图编写单击侦听器并执行相应的操作。里面的动作。

3) 实现 OnClickListener 并根据 id 管理您的点击监听器。

于 2014-04-15T11:52:40.400 回答
0
@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;
}

希望这对你有帮助....

于 2014-04-15T11:52:46.300 回答
0

我也有同样的问题,我正在尝试解决它。我个人认为列表视图的 androids API 很糟糕,应该对其进行改进,使其易于使用和实现。我认为在覆盖get view方法中调用您的侦听器是一个坏主意,因为由于性能原因,您不能总是相信 android 系统会向您返回您请求的确切视图。我引用列表视图的开发人员。使用 View Holder 静态类仅有助于保持视图并更快地访问它们,但它无助于处理列表视图项中特定项目视图的事件侦听器,老实说,我在 Internet 或 Google 上没有看到任何合理的解决方案开发者网站。

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

使用setTagandViewHolder实现,但只是不同,将您的 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% 的事情是你希望对你获得的视图做什么。

于 2014-06-25T15:47:26.253 回答