如何调用ListView的row.xml布局中的按钮实现自动填充收件人发邮件功能
ListView子项按钮点击发送邮件无响应问题修复方案
存在的问题
- 混淆了布局和Activity的关系:row.xml是ListView的子项布局,你单独编写的
rowActivity无需存在,所有点击逻辑都应该在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
相关产品推荐
相关产品推荐

