簡體   English   中英

多個 AutoCompleteTextView 的 OnItemClickListener 與 switch case 不起作用

[英]OnItemClickListener for multiple AutoCompleteTextView with switch case not working

我在布局中有多個AutoCompleteTextView ,所以我已經全局實現了AdapterView.OnItemClickListener

現在的問題是,

我無法在偵聽器中使用switch case 來比較AutoCompleteTextView

代碼

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

謝謝

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

處理列表時不應依賴視圖,尤其是在設置常規項目單擊偵聽器時。

而是在您的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
            }
        });
    }
    ...
}

根據AdapterView.OnItemClickListener 官方文檔

onItemClick()方法有以下參數,

parent:發生點擊的 AdapterView。

view:被點擊的 AdapterView 中的視圖(這將是適配器提供的視圖)

position:視圖在適配器中的位置。

id:被點擊的項目的行 id。

因此,您可能希望使用parent而不是view來接收該父AutoCompleteTextView id

(查看答案以獲取更多詳細信息。)

您要跟蹤的不是孩子的點擊次數,而是 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! **
     }
  });

首先使用數組列表將數據設置到 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());
                                }
                            }
                        }
                    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM