即使在 Visibility.GONE 时,getView 也会重复调用 setOnItemSelectedListener
getView called repetitively with setOnItemSelectedListener even when Visibility.GONE
我正在处理一个 listView,它将包含包含自定义微调器的项目。我正在尝试做的事情的目标是在每个微调器中都有一个条目,当 selected 时,微调器本身会消失,并且会出现一个编辑文本。
在我提供的这个示例中,我在微调器中创建了一个名为 "Create New" 的条目,当 selected 时,应该会出现一个编辑文本,允许您输入新名称。
我看到的问题是当 "Create New" 被 select 编辑时,微调器将变为 visibility.GONE 并显示编辑文本。但是你永远不能 select 编辑文本。我相信 getView 不断被调用,可能会搞乱我想要完成的事情。
任何提示都会很棒!
Activity.java
public class Activity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
List<String> categories = new ArrayList<>();
categories.add("Groceries");
categories.add("Gas");
categories.add("Travel");
List<String> entries = new ArrayList<>();
entries.add("first");
entries.add("second");
entries.add("third");
ListView listView = (ListView) findViewById(android.R.id.list);
listView.setAdapter(new ListAdapter(entries, categories));
}
private class ListAdapter extends ArrayAdapter<String> {
SpinnerAdapter spinnerAdapter;
public ListAdapter(List<String> entries, List<String> categories) {
super(Activity.this, 0, entries);
spinnerAdapter = new SpinnerAdapter(categories);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
}
final Spinner spinner = (Spinner) convertView.findViewById(R.id.spinner);
final EditText categoryEditText = (EditText) convertView.findViewById(R.id.edit_text);
spinner.setAdapter(spinnerAdapter);
spinner.setSelection(spinnerAdapter.getCount());
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// if the create item was selected, hide the spinner and show the edit text
if (position == spinnerAdapter.getCount()-1) {
spinner.setVisibility(View.GONE);
categoryEditText.setVisibility(View.VISIBLE);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return convertView;
}
private class SpinnerAdapter extends ArrayAdapter<String> {
public SpinnerAdapter(List<String> categories) {
super(Activity.this, android.R.layout.simple_spinner_dropdown_item, categories);
categories.add("Create New");
categories.add("Choose a Category");
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return super.getCount() - 1; // last item is a place holder
}
}
}
}
activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
</ListView>
</LinearLayout>
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
启动时
下拉打开
Select 新建并出现 EditText,但它不会保持焦点,因此无法编辑
我找到了解决问题的办法。事实证明真正的问题是在 ListView 中有一个编辑文本。我必须在清单中的 Activity 定义中设置此标志,一切正常!
<activity android:name= ".Activity" android:windowSoftInputMode="adjustPan"/>
也许有人想提供更多说明?如果是这样,我会将您的答案标记为正确答案。
我正在处理一个 listView,它将包含包含自定义微调器的项目。我正在尝试做的事情的目标是在每个微调器中都有一个条目,当 selected 时,微调器本身会消失,并且会出现一个编辑文本。
在我提供的这个示例中,我在微调器中创建了一个名为 "Create New" 的条目,当 selected 时,应该会出现一个编辑文本,允许您输入新名称。
我看到的问题是当 "Create New" 被 select 编辑时,微调器将变为 visibility.GONE 并显示编辑文本。但是你永远不能 select 编辑文本。我相信 getView 不断被调用,可能会搞乱我想要完成的事情。
任何提示都会很棒!
Activity.java
public class Activity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
List<String> categories = new ArrayList<>();
categories.add("Groceries");
categories.add("Gas");
categories.add("Travel");
List<String> entries = new ArrayList<>();
entries.add("first");
entries.add("second");
entries.add("third");
ListView listView = (ListView) findViewById(android.R.id.list);
listView.setAdapter(new ListAdapter(entries, categories));
}
private class ListAdapter extends ArrayAdapter<String> {
SpinnerAdapter spinnerAdapter;
public ListAdapter(List<String> entries, List<String> categories) {
super(Activity.this, 0, entries);
spinnerAdapter = new SpinnerAdapter(categories);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
}
final Spinner spinner = (Spinner) convertView.findViewById(R.id.spinner);
final EditText categoryEditText = (EditText) convertView.findViewById(R.id.edit_text);
spinner.setAdapter(spinnerAdapter);
spinner.setSelection(spinnerAdapter.getCount());
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// if the create item was selected, hide the spinner and show the edit text
if (position == spinnerAdapter.getCount()-1) {
spinner.setVisibility(View.GONE);
categoryEditText.setVisibility(View.VISIBLE);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return convertView;
}
private class SpinnerAdapter extends ArrayAdapter<String> {
public SpinnerAdapter(List<String> categories) {
super(Activity.this, android.R.layout.simple_spinner_dropdown_item, categories);
categories.add("Create New");
categories.add("Choose a Category");
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return super.getCount() - 1; // last item is a place holder
}
}
}
}
activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
</ListView>
</LinearLayout>
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
启动时
下拉打开
Select 新建并出现 EditText,但它不会保持焦点,因此无法编辑
我找到了解决问题的办法。事实证明真正的问题是在 ListView 中有一个编辑文本。我必须在清单中的 Activity 定义中设置此标志,一切正常!
<activity android:name= ".Activity" android:windowSoftInputMode="adjustPan"/>
也许有人想提供更多说明?如果是这样,我会将您的答案标记为正确答案。