一个小问题引发的"Listview里有多个Edittext,点击一个全部都高亮"

        最近在做一个Listview里嵌套多个Edittext的页面,刚开始还没什么问题.界面如下:


        然后还按照需求,上传的时候判断如果输入框为空的话,就改变输入框的背景颜色来提示.这时候就发现这个EditText出现点其中一个,当前画面中所有Edittext都会高亮了.就算怎么修改他们clearFocus也不行.让我非常抓狂,上网到处都查不到相关资料.找了两天,也自己写了个小demo,正常的listview里面有多个Edittext都是正常的.我就把怀疑方向,放到我的业务需求代码那了.

        把所有业务代码屏蔽之后,就正常了.然后一步一步恢复,终于找到问题代码在于设置背景那里! 由于需要判断输入框为空之后,显示别的颜色,又要在有内容后,输入框背景恢复正常.但是设置其他颜色好办,如何恢复默认的背景是个问题,无论是设置透明颜色还是白色,都不是原来默认的.结果我就自作聪明的,在getView()那里保存了默认的background,是一个drawable.之后要恢复默认背景,就把这个drawable设回去.问题就在这个drawable那.后来分析这个drawable应该是xml,本身就设定好了focus和非focus的时候背景.所以点击了edittext之后,由于重用的关系,其他edittext还是把背景变成高亮,但clearFocus没能让这个背景改变.这点通过onTouch和focusChangeListener的log证实了我的想法.

        所以最后的解决方法,我就是找了SDK里面的edittext的背景png和高亮png,自己通过代码来控制他的背景.这样这个"高亮"的bug就解决了. 这里记录一下,方便自己以后碰到类似的问题,也好解决.

Sure! 首先,在你的Activity或Fragment中,你需要有一个ListView对象,类似这样: ```java ListView listView = findViewById(R.id.list_view); ``` 接下来,你需要为ListView设置Adapter,以便显示列表。这我们简单示范一下如何使用ArrayAdapter: ```java final String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); listView.setAdapter(adapter); ``` 注意,这我们只是用了五个字符串作为示例,实际上你需要根据你的业务逻辑来构建item列表,并提供正确的Adapter。 接下来,我们需要为ListView设置一个点击事件监听器,这样当用户点击某个item时,我们就能获取到对应的位置(position)。在这,我们把每个item都认为是可编辑的,并且当用户点击之后,弹出一个对话框,让用户可以修改这个item的内容。示例代码如下: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { // 当用户点击item时,弹出一个对话框,让用户修改item的内容 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("Edit item"); final EditText editText = new EditText(MainActivity.this); editText.setText(items[position]); builder.setView(editText); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 当用户点击对话框的OK按钮时,更新item的内容,并刷新ListView items[position] = editText.getText().toString(); adapter.notifyDataSetChanged(); } }); builder.setNegativeButton("Cancel", null); builder.show(); } }); ``` 最后,记得在修改完item内容后,调用Adapter的notifyDataSetChanged()方法刷新ListView。 这就是一个简单的ListView设置点击事件修改item内容的示例代码了。当然,根据不同的业务场景,你还可以根据需要修改相应的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值