带有开关盒的多个 AutoCompleteTextView 的 OnItemClickListener 不起作用

OnItemClickListener for multiple AutoCompleteTextView with switch case not working

我在布局中有多个 AutoCompleteTextView,所以我在全局实施了 AdapterView.OnItemClickListener

现在的问题是,

我无法比较 AutoCompleteTextView 在侦听器中使用 switch 案例,

Code

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    switch (v.getId()) {
        case R.id.ac_education:
            s_ac_education = testArray[position];
            break;
        case R.id.ac_ethincity:
            s_ac_ethincity = testArray[position];
            break;
        case R.id.ac_languages:
            s_ac_languages = testArray[position];
            break;
        case R.id.ac_location:
            s_ac_location = testArray[position];
            break;
        case R.id.ac_religion:
            s_ac_religion = testArray[position];
            break;
        case R.id.ac_travel:
            s_ac_travel = testArray[position];
            break;
    }
}

注意: view.getId() 总是返回相同的值, 我也试过 if-else 但这也不起作用。 (我已经浪费了几个小时)

编辑

private void init(View v) {
    ac_languages = v.findViewById(R.id.ac_languages);
    ac_religion = v.findViewById(R.id.ac_religion);
    ac_location = v.findViewById(R.id.ac_location);
    ac_travel = v.findViewById(R.id.ac_travel);
    ac_ethincity = v.findViewById(R.id.ac_ethincity);
    ac_education = v.findViewById(R.id.ac_education);
    ptr.setACTVAdapter(getActivity(), ac_education, ac_ethincity, ac_languages, ac_location, ac_religion, ac_travel);

    ac_languages.setHint(R.string.languages);

    ac_religion.setOnItemClickListener(this);
    ac_religion.setHint(R.string.religion);

    ac_location.setOnItemClickListener(this);
    ac_location.setHint(R.string.where_do_you_live);

    ac_travel.setOnItemClickListener(this);
    ac_travel.setHint(R.string.where_can_you_travel);

    ac_ethincity.setOnItemClickListener(this);
    ac_ethincity.setHint(R.string.ethincity);

    ac_education.setOnItemClickListener(this);
    ac_education.setHint(R.string.education);
}

setAdapter(定义在另一个class)

public void setACTVAdapter(Activity activity, AutoCompleteTextView... actv) {
    testArray = activity.getResources().getStringArray(R.array.testArray);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, testArray);
    for (AutoCompleteTextView ac : actv) {
        ac.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}

谢谢

您在处理列表时不应依赖视图,尤其是在设置常规项目点击侦听器时。

而是通过 AutoCompleteTextView 适配器的 public View getView(int position, View convertView, ViewGroup parent) 方法中的每个视图的 ID 获取一个实例,并声明一个点击侦听器以处理您到达那里的位置,如果您想设置多个单独单击一行上的侦听器。

例如:

public class ExampleAdapter extends BaseAdapter {
    ...
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView.findViewById(R.id.ac_education);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Your code here
            }
        });
    }
    ...
}

根据 official doc AdapterView.OnItemClickListener

onItemClick() 方法有以下参数,

parent: The AdapterView where the click happened.

view: The view within the AdapterView that was clicked (this will be a view provided by the adapter)

position: The position of the view in the adapter.

id: The row id of the item that was clicked.

因此,您可能希望使用 parent 而不是 view,以接收 id parent AutoCompleteTextView.

(查看 this 答案以获取更多详细信息。)

您要跟踪的不是 child,而是 convertView。

所以,如果你真的想在你的适配器之外处理 child 点击,你可以这样做:

public interface OnViewClickListener {
  void onViewClick(View view, int position);
}

然后在你的适配器内部:

private OnViewClickListener mListener;

public void setOnViewClickListener(final OnViewClickListener listener) {
     mListener = listener;
}

对于每个 child 你想要的:

child.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
           if (mListener != null) {
              mListener.onViewClick(v, position);
           }
        }
});

这样您可以获得项目点击次数:

  adapter.setOnViewClickListener(new OnViewClickListener() {
     @Override
     public void onViewClick(final View view, final int position) {
        ** PUT YOUR SWITCH CASE HERE! **
     }
  });

首先,创建您的自定义 onItemClickListener:

 public class MyClickListener implements AdapterView.OnItemClickListener {

    AutoCompleteTextView ac;

    public MyClickListener(AutoCompleteTextView myAc){
        ac = myAc;
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        switch(ac.getId()){
            case R.id.autocomplete_1:
                //your code
                break;

            case R.id.autocomplete_2:
                //your code
                break;
        }

    }
}

将它用于您的 AutoCompleteTextView:

autoCompleteTextView.setOnItemClickListener(new MyClickListener(autoCompleteTextView));

首先使用数组列表将数据设置到 Pojo class 中。并且 return 作为 autotextview 的字符串。使用 for 循环将该字符串与 arraylist 的项目值匹配。

autoPartyName.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                            for (CustomersModel list : customersList) {
                                if(list.toString().equals(adapterView.getItemAtPosition(position))){
                                    etContactPhone.setText(list.getContact());
                                    etContactAddress.setText(list.getAddress());
                                }
                            }
                        }
                    });