昨天一个朋友问我,一个问题,gridview嵌套gridview,且内部的gridview不显示完,还能滑动,外部的也可以滑动,怎么实现。 思考后查了资料,这个需要考虑到安卓事件的分发机制,具体就不细说,自己可以去看看,还借鉴了这篇文章给的思路:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=321726&page=1#pid3558454。
话不多说,先看看要实现的效果图是什么样子的。
第一张:外面白色间隔的是外层gridview,内部的数字是内部gridview的每一个item(我只显示6个,实际有10个),来看看滑动后是什么样子的。
第二张:就是内部滑动后的样子。
具体说说实现方法:
首先自定义两个Gridview,外层MyGridView,内层的DragGridView。
重写内层MyGridView的onInterceptTouchEvent方法。 MyGridView类如下:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.GridView;
public class MyGridView extends GridView {
private DragGridView dgView ;
private boolean isDraged = true;
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs){
super(context , attrs);
}
public MyGridView(Context context, AttributeSet attrs, int defStyle){
super(context , attrs,defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// 正在拖拽状态的不要处理,直接透传给DragGridView;
if (getDgView() != null && getDgView().isDraged()) {
return false;
}
return super.onInterceptTouchEvent(event);
}
public boolean isDraged() {
return isDraged;
}
public void setDraged(boolean isDraged) {
this.isDraged = isDraged;
}
public DragGridView getDgView() {
return dgView;
}
public void setDgView(DragGridView dgView) {
this.dgView = dgView;
}
}
外部DragGridView添加了一个方法,代码如下:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;
public class DragGridView extends GridView {
private boolean flag_isDraged = false;
public DragGridView(Context context) {
super(context);
}
public DragGridView(Context context, AttributeSet attrs){
super(context , attrs);
}
public DragGridView(Context context, AttributeSet attrs, int defStyle){
super(context , attrs,defStyle);
}
public boolean isDraged() {
return isFlag_isDraged();
}
public boolean isFlag_isDraged() {
return flag_isDraged;
}
public void setFlag_isDraged(boolean flag_isDraged) {
this.flag_isDraged = flag_isDraged;
}
}
isDraged方法是用来判断内部gridview有没有在滑动的。在MyGridView有使用到。
接下来就是在内部外部MyGridView的adapter内写DragGridView的setOnItemLongClickListener长点击事件,修改DragGridView的滑动状态。
older.gridView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i("", "111111111111111");
myGridView.setDgView(dragGridView);
dragGridView.setFlag_isDraged(true);
return false;
}
});
在setOnTouchListener方法中取消滑动状态。
holder.gridView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
Log.i("", "1111111--1111111");
dragGridView.setFlag_isDraged(false);
break;
def :
break;
}
return false;
}
})
主要代码都在上面了,如果想下载 完整demo的可以点击下面的链接:
下载完整demo链接:http://download.csdn.net/detail/u013790519/8528405
转载时请说明,谢谢。