我创建了一个ListView,其子节点由一个EditText组成。但是,当我单击EditText,给它焦点,然后notifyDataSetChanged()
,更新ListView,然后再次单击任何EditTexts时,将为列表中的每个EditText绘制一个光标(Nexus 5,模拟器等) 。)
在Nexus 5
上以下是我的列表和列表项的xml。
activity_main.xml中
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.zlistfocus.MainActivity"
tools:ignore="MergeRootFrame" />
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:paddingBottom="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="4dp" />
因为我希望EditText能够获得焦点,所以我在这里遵循了一些提示和指示:https://stackoverflow.com/a/4901683/499125。具体来说,我将android:windowSoftInputMode="adjustNothing"
添加到AndroidManifest.xml中的Activity标记,以便列表项可以获得焦点,从而产生此问题。然后我尝试将OnItemSelectedListener
附加到列表视图,作为所选答案的建议。但是,这些幽灵游标仍然存在。
@AnswerBot:我正在使用一个ArrayAdapter,它包含一个整数列表。
public class MainActivity extends ActionBarActivity {
private ListView lv;
private ArrayAdapter<Integer> adapter;
private List<Integer> data = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
adapter = new ArrayAdapter<Integer>(this, R.layout.listview_item, R.id.tv, data);
lv.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 0, "Refresh");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == 1) {
getSomeData();
return true;
}
return super.onOptionsItemSelected(item);
}
private void getSomeData() {
if (data.isEmpty()) {
for (int i = 0; i < 20; i++) {
data.add(i);
}
} else {
int start = data.get(data.size() - 1) + 1;
for (int i = 0; i < 20; i++) {
data.set(i, start + i);
}
}
adapter.notifyDataSetChanged();
}
}
答案 0 :(得分:3)
您可以通过调用相关EditText上的setCursorVisible(false)来隐藏EditText的光标。
修改强> 为此,您可能希望使用自定义适配器(BaseAdapter),并在getView方法中执行以下操作:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
...
editText.setCursorVisible(editText.hasFocus());
return convertView;
}
答案 1 :(得分:0)
您应该清除所有 editTexts 上的焦点,然后在要在其中设置焦点的目标 editText 中请求焦点。
//clearList has All EditText
public void setEdFocus(EditText targetED) {
for (EditText editText : clearList) {
if (editText != targetED&& editText.hasFocus()) {
editText.clearFocus();
}
}
targetED.requestFocus();
}
它以这种方式与我一起工作,clearList 是列表包含所有 EditText
答案 2 :(得分:0)
将此命令添加到 Manifest.xml
中的所需活动。
android:windowSoftInputMode="stateAlwaysHidden"