【问题标题】:How to implement click listener on custom listview如何在自定义列表视图上实现点击监听器
【发布时间】:2014-04-15 11:33:25
【问题描述】:

我已经创建了自定义列表视图,在一个列表中有 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;
}

【问题讨论】:

    标签: android android-listview onitemclicklistener onitemclick


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
      
          // CLICK LISTENERS
      
      }
      

      【讨论】:

        【解决方案3】:

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

        android:clickable="true"
        

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

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

        android:onClick="your method name"
        

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

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

        【讨论】:

          【解决方案4】:
          @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;
          }
          

          希望对你有帮助....

          【讨论】:

            【解决方案5】:

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

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

            使用 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% 的事情是你希望对你获得的视图做什么。

            【讨论】:

              猜你喜欢
              • 2012-02-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-17
              相关资源
              最近更新 更多