Android GridView和EditText焦点冲突问题

来源:互联网 发布:动态字幕制作软件 编辑:程序博客网 时间:2024/06/05 19:29

这里写图片描述
效果:长按Item可删除该item;edittext中可编辑内容。

用到的属性: android:descendantFocusability
descendantFocusability的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点


走过的路,还是记录一下吧:

1.

//item的布局 item_gridview<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <EditText        android:id="@+id/editText"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

gridview.setAdapter(adapter);

如此,则edittext可编辑,item的长按事件无法捕获到。


2.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:descendantFocusability="blocksDescendants"    android:orientation="vertical">    <EditText        android:id="@+id/editText"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

如此,item的长按事件可捕获到,edittext获取不到焦点无法编辑。


3.参考ListView中EditText焦点问题:http://www.cnblogs.com/skyseraph/archive/2013/04/21/3033848.html


4.以上都试过了,都不能实现想要的效果。于是……

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/ll_item"    android:orientation="vertical">    <EditText        android:id="@+id/editText"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

自定义的GridViewAdapter,只贴了有用的部分

public class GridViewAdapter extends BaseAdapter {    private Context context;    private CallBackInterface callBackInterface;    public GridViewAdapter(Context context){        this.context=context;    }//添加长按监听接口    public void setLongClickCallBack(CallBackInterface backInterface){        this.callBackInterface=backInterface;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        convertView= LayoutInflater.from(context).inflate(R.layout.item_gridview,null);        LinearLayout ll_item= (LinearLayout) convertView.findViewById(R.id.ll_item);        EditText editText= (EditText) convertView.findViewById(R.id.editText);        ll_item.setOnLongClickListener(new MyLongClickListener(position,callBackInterface));        return convertView;    }}
 class MyLongClickListener implements View.OnLongClickListener{     private int position;     private CallBackInterface backInterface;     public MyLongClickListener(int position,CallBackInterface callBackInterface){         this.position=position;         this.backInterface=callBackInterface;     }     @Override     public boolean onLongClick(View v) {         backInterface.callBack(position);         return true;     } }
public interface CallBackInterface {    public void callBack(int position);}
//初始化adapter后调用长按回调,做相应处理 adapter.setLongClickCallBack(new CallBackInterface() {            @Override            public void callBack(int position) {                //做相应的处理            }        });        adapter.notifyDataSetChanged();

其实就是监听父控件的长按事件,实现的效果跟gridview.setonLongClickListener()的监听效果一样。


呵呵呵···,只想说条条大路都能到家~~这里写图片描述

0 0