Android开发之ListView+EditText-要命的焦点问题终极解决方案

很多人在处理listview与edittext的焦点问题时候,会发现软键盘重新加载的问题,在网上看了一些解决方案,觉得可行,但是在我把edittext设置成数字输入的时候问题又出现了,因为软键盘的出现。listview会被加载两次,但是第二次其实中间有个间隙,在这个间隙中,会有一次默认软键盘弹出(也就是会弹出输入拼音的那个界面,这样的话就会看到软键盘弹出两次,用户体验不是很好)综上,想了一会,一不小心想到个办法试了一下,结果可行

原始理论借鉴于这里,说的很详细,我就不细说了 只说重点处http://blog.csdn.net/l_serein/article/details/7524702 但是这里有个错误 一定要注意 下面会说明这个错误点

以下代码志勇注意加红打字即可,简单好用(主要是因为对于一些指定了软键盘输入类型的输入框所需要解决的问题)

 

public View getView(final int position, View convertView, ViewGroup parent) {
CarListViewCache viewCache;
if (convertView == null) {
convertView = new LinearLayout(activity);
} else {
//newnumber这里为一个全局变量
if (newnumber!=null) {
newnumber.requestFocus();
}
 
((LinearLayout) convertView).removeAllViews();
// viewCache = (CarListViewCache) convertView.getTag();
}
final GoodsList imageAndText = getItem(position);
LayoutInflater inflater = activity.getLayoutInflater();
childView = inflater.inflate(R.layout.car_activity_item, null);
viewCache = new CarListViewCache(childView);
viewCache.describe = (TextView) convertView
.findViewById(R.id.car_activity_unitprice);
viewCache.number = (EditText) convertView
.findViewById(R.id.car_activity_number);
viewCache.name = (TextView) convertView
.findViewById(R.id.car_activity_name);
convertView.setTag(viewCache);
// Load the image and set it on the ImageView
// Set the text on the TextView
TextView name = viewCache.getNameView();
name.setText(imageAndText.getName());
number = viewCache.getNumberView();

number.setText("" + imageAndText.getNumber());

number.setTag(position+"");//这里不多解释了,自己看吧

TextView price = viewCache.getDescribeView();
price.setText("¥" + imageAndText.getPrice());
((LinearLayout) convertView).addView(childView, fillParentLayoutParams);
number.setOnTouchListener(new OnTouchListener() {


public boolean onTouch( View view , MotionEvent event) {


// 在TOUCH的UP事件中,要保存当前的行下标,因为弹出软键盘后,整个画面会被重画


// 在getView方法的最后,要根据index和当前的行下标手动为EditText设置焦点


if (event.getAction() == MotionEvent.ACTION_UP) {


//index = Integer.parseInt(number.getTag().toString());//这个是错误的,更不要写成index = postion;那你就是2,我承认我2过了
index = Integer.parseInt(view.getTag().toString());//这里一定要注意view.getTag().toString()是上面onTouch(View view, MotionEvent event)传进来的,不然是会有错乱的 这也就是我说的上面地址的错误所在,为了这个我白花了三个小时
newnumber = (EditText) view;这里也最好这样去获取,如果直接number =newnumber ;应该也是可以的,但是个人觉得这样更合理,原因就是上面的一句


}


return false;


}


});

下面两端函数 一个都不能少  一个是为了解决定位问题,另一个是为了解决锁屏后重新解锁后悔弹出一个默认软键盘

之前也说过是因为制定了输入框的输入类型才引发的这些问题,所以下面两行必须有

//锁屏问题的解决方案

if (index!=-1&&(index==position)) {
number.requestFocus();
}
// //重新定位的解决方案
if (newnumber!=null) {
newnumber.requestFocus();
}


return convertView;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ViewPager中嵌套ListView时,可能会遇到ListView无法滑动的问题,这是因为ViewPager会拦截ListView的滑动事件。解决方法如下: 1. 自定义ListView,重写其onInterceptTouchEvent()方法,返回false,让ViewPager不拦截ListView的滑动事件。 ``` public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false); break; case MotionEvent.ACTION_UP: setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); } } ``` 2. 在ViewPager的适配器中,将ListView所在的布局设置为android:descendantFocusability="blocksDescendants",防止ListView获取焦点而导致ViewPager无法滑动。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> <com.example.MyListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 以上两种方法都可以解决ViewPager中ListView失效的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值