不知道为啥,markdown编辑器不能用,一打开就奔溃,换个浏览器也不行,重启也不好使,估计是csdn那块出问题了吧;索性这会想写就干脆用普通编辑器写了,排版不好了大伙多担待。项目实现方法如果有更好的还望指出,一起学习。
刚接手一个私活,里边有个类似优信二手车品牌选择的功能。就是下图样式:主页面是个list 然后点击主页面list的item会弹出侧滑栏,并且弹出侧滑栏后主页面的item还可以点击并不同的item对应不同的侧滑栏内容。上网百度了一番,都是简单的侧滑栏效果,没有时间处理,主页面可以点击替换侧滑栏的效果,索性就自己写一个了
优信二手车品牌选择的效果
自己的demo效果
事件分析:其实就是侧滑栏拦截了事件,不叫主页面接收事件。那就重写侧滑栏drawerlayout 重写他的onintercepttouchevent方法 不拦截就可以了。然后在点击主页面的item时处理自己需求的逻辑就ok了
注意的问题:
1 . 网上有说遇到点击穿透的,意思就是侧滑栏弹出时 有些侧滑栏的按钮没有设置点击事件,然后点击这些按钮的时候会响应主页面对应区域的逻辑;这个解决方法百度一堆,直接在drawerlayout的对应xml里设置clicked属性为true即可 (
android
:clickable=
"true"
) 不过我写的时候没有遇到,但是还是写上吧,防患于未然嘛。
2. 第二个就是事件的处理了,在问题分析说过了
3. 还有就是在xml里边侧滑栏布局要写在主页面的下边,并且设施
layout_gravity
属性。不然没效果
4. 最后一个是需求问题,需求要求滑动主页面list时候侧滑栏关闭,这个简单,直接给主页面list加一个监听就完事了
5. 另外还有个优信主页面的gridview和listview穿插的效果;这个网上代码应该很多,用recyclerview调用gridlayoutmanager的setSpanSizeLookup方法并重写getSpanSize方法然后根据自己的逻辑写就ok了,这个就不多说了下面会给出示例代码
drawerlayout布局示例代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.daodan.mytestrecyclerview.MyDrawerLayout
android:id="@+id/drawerlayout"
android:clickable="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--主布局-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/main_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!--侧滑菜单-->
<LinearLayout
android:id="@+id/ll_cehua"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="#999999"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="可以自定义加一些布局,下边的list可随外部item点击变换内容"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/right_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- <FrameLayout
android:id="@+id/right_framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>-->
</LinearLayout>
</com.daodan.mytestrecyclerview.MyDrawerLayout>
</RelativeLayout>
drawerlayout重写代码
public class MyDrawerLayout extends DrawerLayout {
public MyDrawerLayout(Context context){
this(context, null);
}
public MyDrawerLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs,defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
return false;
}
}
滑动主页面list关闭侧滑栏示例代码
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (drawerlayout.isDrawerOpen(Gravity.RIGHT)){
drawerlayout.closeDrawers();
}
}
});
主页面穿插list和grid示例代码
final GridLayoutManager manager = new GridLayoutManager(this,2);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//这里根据自己的逻辑返回1或者2(因为上面设置了最大2)
}
});
感谢: http://stackoverflow.com/questions/18743124/make-main-content-area-active-in-drawerlayout