我有一个ListView
,我为此制作了自定义适配器。列表中的某些项目有一个EditText
,我设置onFocusChangeListener
来存储输入的数据。
问题是:
在显示软键盘后,从EditText
聚焦ListView
,将失去对EditText
的关注。可以通过再次选择它来集中注意力。我该如何避免这种情况?
自定义适配器中的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;
}
list_item_edit_content.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>
答案 0 :(得分:0)
我的观点是问题在于显示键盘时的活动娱乐。通过添加AndroidManifest.xml来防止这种情况:
<activity android:name=".MyActivity"
android:windowSoftInputMode="adjustPan"
android:label="@string/app_name">
答案 1 :(得分:0)
我还没有机会复制并运行这段代码,但是当我发现ListViews和Adapters时,我发现我不相信“view.getId()”方法。 。
甚至以编程方式从ListView中检索子项然后运行child.getId()从来都不可靠。
我遇到了很多问题,它没有返回“我们认为是视图”的ID,因为适配器重新使用了使事情变得复杂的视图。
我会研究方法:“hasFocus”和“requestFocus”。其他一些View或ViewGroup正在获得焦点。 试试:
Log.i("TAG", "View with focus = " + getCurrentFocus());
Log.i("TAG", "View with focus = " + getCurrentFocus().getId());
找出哪个视图正在获得焦点,然后从那里开始。
它们已被证明非常有用并且向后兼容我。