android listview接口回调

这里写图片描述
listview中假设有这么一种情况,如上图,我们要点击listview中的电话号码才可以拨号,点击其他地方则不会有反应。如果我们把执行拨号的代码写在适配器中的话,则无法执行,因此这个时候就需要用到接口回调了,点击listview中的某个控件,让这个控件的监听逻辑在当前activity中执行。

首先在adapter中定义一个接口

public interface OnCall {
    public void setInfo(String nm, int position);
}

setInfo 里的参数根据自己的需要填写。然后在适配器中定义一个全局变量

OnCall onCall;

在写一个赋值的方法

public void setOnCall(OnCall onCall) {
    this.onCall = onCall;
}

然后在getView方法中写上需要点击控件的监听事件

viewHold.tv_telephoneNo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onCall.setInfo(list.get(position).get("content3"), position);
            }
        });

下面是适配器的全部代码

package com.example.cram_baa.adapter;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.cram_baa.R;

import java.util.ArrayList;
import java.util.HashMap;

public class MyClassMateAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;
    private ArrayList<HashMap<String, String>> list;
    OnCall onCall;

    public MyClassMateAdapter(Context context, ArrayList<HashMap<String, String>> list) {
        this.context = context;
        this.list = list;
        inflater = LayoutInflater.from(context);
    }

    public void setOnCall(OnCall onCall) {
        this.onCall = onCall;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHold viewHold = null;
        if (convertView == null) {
            viewHold = new ViewHold();
            convertView = inflater.inflate(R.layout.list_my_class_mate, null);
            viewHold.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            viewHold.tv_class = (TextView) convertView.findViewById(R.id.tv_class);
            viewHold.tv_telephoneNo = (TextView) convertView.findViewById(R.id.telephone_number);
            convertView.setTag(viewHold);
        } else {
            viewHold = (ViewHold) convertView.getTag();
        }

        viewHold.tv_name.setText(list.get(position).get("content1"));
        viewHold.tv_class.setText(list.get(position).get("content2"));
        viewHold.tv_telephoneNo.setText(list.get(position).get("content3"));

        viewHold.tv_telephoneNo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onCall.setInfo(list.get(position).get("content3"), position);
            }
        });
        return convertView;
    }


    public static class ViewHold {
        TextView tv_name, tv_class, tv_telephoneNo;
    }

    public interface OnCall {
        public void setInfo(String nm, int position);
    }
}

然后是activity,根据从适配器中获取的参数来执行打电话

adapter.setOnCall(new MyClassMateAdapter.OnCall() {
            @Override
            public void setInfo(String nm, int position) {
                Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+nm));
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                Log.i("infos","电话:"+nm+"  ,位置:"+position);
            }
        });
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值