您的位置:首页 > 移动开发 > Android开发

Android GridView和EditText焦点冲突问题

2016-12-08 16:32 465 查看


效果:长按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()的监听效果一样。

呵呵呵···,只想说条条大路都能到家~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息