android-ListView错误中带有onFocusChangeListener的EditText
我有一个android-ListView错误中带有onFocusChangeListener的EditText,android,listview,android-listview,android-edittext,Android,Listview,Android Listview,Android Edittext,我有一个列表视图,我为它定制了一个适配器。列表中的某些项有一个EditText,我为它设置了onfocuschangesetener,以存储在其中键入的数据 问题是: 从列表视图聚焦编辑文本,显示软键盘后,该编辑文本的聚焦将丢失。可以通过再次选择它来聚焦。我如何避免这种情况 自定义适配器中的getView()方法: @Override public View getView(final int position, View convertView, ViewGroup parent) {
列表视图
,我为它定制了一个适配器。列表中的某些项有一个EditText
,我为它设置了onfocuschangesetener
,以存储在其中键入的数据
问题是:
从列表视图
聚焦编辑文本
,显示软键盘后,该编辑文本
的聚焦将丢失。可以通过再次选择它来聚焦。我如何避免这种情况
自定义适配器中的getView()
方法:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if(convertView == null)
{
holder = new ViewHolder();
switch(type)
{
case NORMAL:
convertView = inflater.inflate(R.layout.list_item_edit_content, parent, false);
holder.title = (TextView) convertView.findViewById(R.id.rowName);
holder.input = (EditText) convertView.findViewById(R.id.input);
break;
case SPECIAL:/* some code */
break;
}
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
switch(type)
{
case NORMAL:
holder.title.setText(columnNames.get(position));
holder.input.setText(data.get(position));
holder.input.setId(position);
holder.input.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
final int pos = v.getId();
EditText txt = (EditText) v;
data.set(pos, txt.getText().toString());
}
});
break;
case SPECIAL: /* some other code */
break;
}
return convertView;
}
列表项编辑内容.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#11000000"
android:orientation="vertical" >
<TextView
android:id="@+id/rowName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:textColor="#0000ff" >
<requestFocus />
</EditText>
</LinearLayout>
我的观点是,当显示键盘时,问题在于活动娱乐。通过在AndroidManifest.xml中添加以下内容来防止此情况:
<activity android:name=".MyActivity"
android:windowSoftInputMode="adjustPan"
android:label="@string/app_name">
我还没有机会复制并运行此代码,但我可以马上告诉您,我发现在ListView和适配器方面不信任“view.getId()”方法 即使以编程方式从ListView中检索子对象,然后运行child.getId()也不可靠 我对它没有返回ID“what we think is the view”有很多问题,因为适配器重复使用视图,这使事情变得复杂 我将研究这些方法:“hasFocus”和“requestFocus”。其他一些视图或视图组正在获得焦点。 尝试: 找出哪个视图正在获得焦点,然后从那里开始
它们对我来说非常有用并且向后兼容。我不确定它是否能解决您的问题,但您的onFocusChange事件可能需要考虑hasFocus。否则,当您获得焦点或失去焦点时(除非这是您想要的),它将执行该事件xml@GregEnnis我想你指的是安卓:focusable=“false”,在这种情况下,它不起作用。我还从xml中删除了,但它仍然不起作用。是的,我只是把它放在一个注释中,因为我不知道它是否会起作用。我认为问题也存在,但我还不知道如何让它按预期的方式工作(我是java和android新手)我在决定布局设计时已经试过了,adjustPan会将列表中的最后几项放在软键盘后面。
Log.i("TAG", "View with focus = " + getCurrentFocus());
Log.i("TAG", "View with focus = " + getCurrentFocus().getId());