如何在ListView中显示EditText时隐藏多个光标?

6
我创建了一个ListView,其子项只包含一个EditText。然而,当我单击EditText,使其获得焦点, 然后调用notifyDataSetChanged()更新ListView,并再次单击任何一个EditText时,在列表中的每个EditText上都会出现光标(Nexus 5,模拟器等)。
在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://dev59.com/NnE85IYBdhLWcg3wpFIa#4901683。具体来说,我在AndroidManifest.xml中的Activity标签中添加了android:windowSoftInputMode="adjustNothing",以使列表项可以获得焦点,从而创建了这个问题。然后,我尝试按照所选答案建议的将OnItemSelectedListener附加到listview上。但是,这些幽灵光标仍然存在。
@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();
    }
}

如果您使用了自定义适配器,请发布它。 - AnswerBot
我已经更新了我的问题,更加清晰明了。 - Some Noob Student
3个回答

3
你可以调用setCursorVisible(false)来隐藏EditText的光标。 编辑: 为此,你可能需要使用自定义适配器(BaseAdapter),并在getView方法中执行类似以下操作:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ...

    editText.setCursorVisible(editText.hasFocus());

    return convertView;
}

这个解决方案解决了多光标问题。但现在,我根本看不到选择器。有没有办法显示选择器? - Sreeram Sunkara

0
将此命令添加到所需的活动中的Manifest.xml文件。
android:windowSoftInputMode="stateAlwaysHidden"

0

你应该清除所有editText的焦点,然后在你想要设置焦点的目标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的列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接