You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用ListView的row.xml布局中的按钮实现自动填充收件人发邮件功能

ListView子项按钮点击发送邮件无响应问题修复方案

存在的问题

  • 混淆了布局和Activity的关系:row.xml是ListView的子项布局,你单独编写的row Activity无需存在,所有点击逻辑都应该在ListView适配器的getView方法中处理
  • Intent配置错误:ACTION_SEND搭配mailto协议的写法不符合系统规范,导致无法唤起邮件应用
  • 未绑定当前Item的数据:点击事件中没有获取对应列表项的邮箱地址,无法自动填充收件人
  • ViewHolder使用不规范:按钮没有存入ViewHolder,列表滚动复用时会出现事件和数据错乱的问题

修复代码

第一步:修改ViewHolder类定义

在你原有ViewHolder类中补充按钮的声明:

class ViewHolder {
    // 你原有的其他控件声明
    Button btnEnviarEmail;
    TextView txtEmail;
    // ...其余原有代码
}

第二步:修改适配器getView逻辑

public View getView(int position, View convertView, ViewGroup parent) {
    View row=convertView;
    ViewHolder holder;
    if (row==null){
        LayoutInflater inflater=(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        row=inflater.inflate(layout,null);
        holder=new ViewHolder();
        holder.txtnome=row.findViewById(R.id.txtNome);
        // 把按钮存入ViewHolder
        holder.btnEnviarEmail=row.findViewById(R.id.BtnEnviarEmail);
        holder.txttelefone=row.findViewById(R.id.txtTelefone);
        holder.txtdataNascimento=row.findViewById(R.id.txtDataNascimento);
        holder.txtEmail=row.findViewById(R.id.txtEmail);
        holder.txtprovidencia=row.findViewById(R.id.txtProvidencias);
        holder.imageView=row.findViewById(R.id.imgIcon);
        row.setTag(holder);
    } else {
        holder=(ViewHolder)row.getTag();
    }

    // 绑定当前Item的数据
    Model model =recordList.get(position);
    holder.txtnome.setText(model.getNome());
    holder.txttelefone.setText(model.getTelefone());
    holder.txtdataNascimento.setText(model.getDataNascimento());
    final String currentEmail = model.getEmail();
    holder.txtEmail.setText(currentEmail);
    holder.txtprovidencia.setText(model.getProvidencias());
    byte[] recordImage=model.getImage();
    Bitmap bitmap = BitmapFactory.decodeByteArray(recordImage,0,recordImage.length);
    holder.imageView.setImageBitmap(bitmap);

    // 绑定按钮点击事件,使用当前Item的邮箱填充收件人
    holder.btnEnviarEmail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String[] TO={currentEmail};
            String[]CC={""};
            // 修复Intent配置,使用ACTION_SENDTO适配mailto协议
            Intent intent=new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse("mailto:"));
            intent.putExtra(Intent.EXTRA_CC,CC);
            intent.putExtra(Intent.EXTRA_EMAIL,TO);
            intent.putExtra(Intent.EXTRA_SUBJECT,"自定义邮件主题");
            intent.putExtra(Intent.EXTRA_TEXT,"自定义邮件内容");
            try {
                context.startActivity(Intent.createChooser(intent,"选择邮件应用发送"));
            }catch (android.content.ActivityNotFoundException ex ){
                ex.printStackTrace();
                // 可在此处添加Toast提示用户设备未安装邮件应用
            }
        }
    });
    return row;
}

注意事项

测试前请确保设备上安装了至少一个可处理邮件协议的应用,否则会触发ActivityNotFoundException。

内容的提问来源于stack exchange,提问作者JhonPeter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:06