带有开关盒的多个 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());
}
}
}
});
我在布局中有多个 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());
}
}
}
});