【问题标题】:OnItemClickListener for multiple AutoCompleteTextView with switch case not working多个 AutoCompleteTextView 的 OnItemClickListener 与 switch case 不起作用
【发布时间】:2018-09-20 07:24:08
【问题描述】:

我在布局中有多个AutoCompleteTextView,所以我在全局范围内实现了AdapterView.OnItemClickListener

现在的问题是,

我无法比较 AutoCompleteTextView 在侦听器中使用 switch 大小写,

代码

@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(在另一个类中定义)

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();
    }
}

谢谢

【问题讨论】:

  • 试试这个,switch (parent.getId()) 而不是 switch (v.getId()) 这个。
  • @JeelVankhede 不,它的回报是 -1。
  • 你能分享一下你分配适配器和监听器的代码吗?
  • @JeelVankhede 您现在可以查看,我只是在问题中添加了更多代码

标签: android xml switch-statement autocompletetextview


【解决方案1】:

首先,创建您的自定义 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));

【讨论】:

    【解决方案2】:

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

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

    例如:

    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
                }
            });
        }
        ...
    }
    

    【讨论】:

    • AutoCompleteTextView 不是列表项,它们是使用 标签在布局中单独定义的
    • 您没有适配器来处理建议的项目选择吗?如果你不知道,OnItemClickListener 是干什么用的?
    • 项目的位置不是问题,我无法使用 AutoCompleteTextView 的资源 id 比较 view.getId()
    【解决方案3】:

    根据official docAdapterView.OnItemClickListener

    onItemClick() 方法有以下参数,

    父级:发生点击的 AdapterView。

    视图: AdapterView 中被点击的视图(这将是 适配器提供的视图)

    位置:视图在适配器中的位置。

    id:被点击的项目的行id。

    因此,您可能希望使用 parent 而不是 view 来接收父 AutoCompleteTextViewid >.

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

    【讨论】:

    • 但在使用 parent.getId() 时返回 -1
    • Log.e(TAG, "onItemClick: " + parent.getId() + " -- " + v.getId() + "--" + R.id.ac_education);跨度>
    • 其实应该可以的,因为官方文档也这么说。
    • Fragment1: onItemClick: -1 -- 16908308--2131361799
    • 在这里查看我的日志,parent.getId() 是-1
    【解决方案4】:

    您要跟踪的不是孩子的点击次数,而是convertView。

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

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

    然后在您的适配器内部:

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

    对于您想要的每个孩子:

    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! **
         }
      });
    

    【讨论】:

    • 我想写更少的代码,这就是我使用 switch case 的原因,但你的方式太冗长了。因为如果我将在每个视图上实现 onItemClickListener,那么我可以很容易地做到这一点。
    • @ImranSamed 所以你不能只检查适配器之外的 v.getId() 。因为它的convertView,而不是你想要的孩子。你得到 -1 因为这个视图没有 ID
    • 谢谢你的时间,但我得到了解决方案,你可以检查接受的答案
    • @ImranSamed 是不是除了自定义的 onClickListener 之外的任何东西?!顺便说一句,快乐的编码人。
    【解决方案5】:

    首先使用数组列表将数据设置到 Pojo 类中。并作为 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());
                                    }
                                }
                            }
                        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多