Listview中的嵌套EditView等抢焦点view

View (positionView convertViewViewGroup parent) {
    ViewHolder holder(convertView == ){
        holder = ViewHolder()convertView = getLayoutInflater().inflate(R.layout.)holder.= (EditText) convertView.findViewById(R.id.)holder.= (TextView) convertView.findViewById(R.id.)holder..setFocusable()holder..setFocusableInTouchMode()holder..addTextChangedListener(TextWatcher() {
            (CharSequence sstartcountafter) {
                
            }

            (CharSequence sstartbeforecount) {
            }

            (Editable s) {
                Log.(+ ).put(.s.toString())}
            })holder..setOnFocusChangeListener(View.OnFocusChangeListener() {
            (View vhasFocus) {
                      Log.(+ v ++ 
                      .++ hasFocus)= .}
        })convertView.setTag(holder)}{
        holder = (ViewHolder) convertView.getTag()}
      Log.(+ )holder.= positionholder..setText(String.(position))holder..setText(.get(position))(== holder.&& !holder..hasFocus()){
        holder..requestFocus()CharSequence text = holder..getText()(text Spannable) {
               Spannable spanText = (Spannable)textSelection.(spanTexttext.length())}
      }{
        .requestFocus()}
    Log.(+ holder)convertView}

其中viewHolder代码块:

ViewHolder{
    LinearLayout EditText TextView String () {
        +
                + +
                + +
                + +
                }
}

上面其实是我为了尝试listview使用缓存

因为是焦点组件,需要记录一些Focus焦点位置,而viewHolder为缓存着复用组件所以每次每次获取到Viewholder

都需要在getview里比较靠前的位置先把里面的position参数设置正确

而focus状态和position是绑定的,所以在滑到指定有focus的position的时候需要手动将焦点view即edittext调用requestfocus(),同时其他的clear的有focus的view,避免焦点错乱。

但是现实是焦点并没有clearfocus之后editetext并不能准确的获取到focus,导致输入的时候出现无法输入的情况

最终解决办法是不适用缓存,每次getview的时候都去初始化一个新的view,发现这个问题确实不存在了。

所以这个问题的解决方案是下下策,后期如果能解决视图缓存的问题,才算完美解决。

(convertView == ){
        holder = ViewHolder()
}{
        holder = (ViewHolder) convertView.getTag()}

把这两行注释之后功能就可以正常使用了。

这里说的只是其中一种其他的类似 checkBox解决方案是一致的。

你可能感兴趣的:(Listview中的嵌套EditView等抢焦点view)