SetOnClickListener 与 setOnItemClickListener

问题描述

View 为一个 ListView 两个按钮(例如执行:呼叫、发送短信)。我想为点击按钮设置一个监听器。我的理解是,如果我设置了 OnItemSelectedListener,我将不知道点击了两个按钮中的哪一个

当我为一个按钮设置监听器时,当我点击它时,我会得到列表中最后一项(不是我点击的那个)中相应按钮的监听器(这在编程上是有意义的)但是这不是我想要的。我可以判断,因为它总是调用属于列表中最后一项的号码。 关于如何为每个项目中的多个视图设置 OnClick 的任何提示

@NonNull
@Override
public View getView(final int position,@Nullable final View convertView,@NonNull ViewGroup parent) {
    LayoutInflater inf = ((Activity)context).getLayoutInflater();

    View view = inf.inflate(R.layout.place,parent,false);


    name = view.findViewById(R.id.name);
    type = view.findViewById(R.id.type);
    minAge = view.findViewById(R.id.minAge);
    open = view.findViewById(R.id.open);
    close = view.findViewById(R.id.close);
    distance = view.findViewById(R.id.distance);
    phone = view.findViewById(R.id.phone);
    picture = view.findViewById(R.id.picture);
    btnCall = view.findViewById(R.id.btnCall);

    final Place place = placeList.get(position);
    // btnCall.setonClickListener(this);
    // I tried both setups with the same result.
    // the button is always the one belonging to the last item in the list.
    btnCall.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
             String s = btnPhone.getText().toString();

        }
    });
    // another button would have its own OnClick
    name.setText(place.getName());
    type.setText(place.getType());
    minAge.setText(Integer.toString(place.getMinAge()));
    open.setText(Integer.toString(place.getopen()));
    close.setText(Integer.toString(place.getClose()));
    distance.setText(Integer.toString(place.getdistance()));
    phone.setText(place.getPhone());
    int id = context.getResources().getIdentifier("place"+position,"drawable",((Activity)context).getPackageName());
    //row_pic.setimageResource(id);
    return view;
}

@Override
public void onClick(View v) {
   Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phone.getText()));
    if (intent.resolveActivity(context.getPackageManager()) != null) {
        context.startActivity(intent);
    }


    if (intent.resolveActivity(context.getPackageManager())  != null)
    {
        context.startActivity(intent);
    }
}

解决方法

我在发布问题后找到了解决方案。 使用标签传递数据。

''' phone.setText(place.getPhone()); btnCall.setTag(phone.getText().toString());

    btnCall.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String s =  (String) ((Button) view).getTag().toString();
            // now I can call the correct number
        }
    });

'''

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...