最近做到一个视频项目,要求防腾讯视频的效果,包括首页,频道管理,和分类视图,自己写了一个首页,和一个分类视图,在网上看到了一个频道管理的已经有了高仿源码,就直接拿过来用了,这里贴上频道管理原文链接:
先上效果图:
仔细看了一下腾讯视频的分类视图界面,最顶部是两大类型,最新,最热, 当选择最新最热的时候,下面的子栏目其实没有发生变化,变化的只有一个最下方的listview的数据,也就是大类型和子类型之间其实没有关联关系,
如果有关联关系,就需要在每次点击大类型的时候,重新clear掉在HorizontalScrollView中动态添加的标签(ps:动态标签外面必须用一层布局包含进去,因为HorizontalScrollView中不允许有多个view),然后每次都重新加载一遍,也就是重新动态添加一遍;
没有关联关系的话,只需要自定义一个视图,在自定义视图中创建一个linearylayout和一个横向的scroolview,动态添加scrollview中的元素,当然,linearlayout和scrollview中的view都要添加单击事件监听,事件监听只需要在自定义视图中实现,定义一个接口,暴露给外界,别忘记在定义接口方法的时候,传入当前大类型的id和小类型的ID哟!然后实现该接口的方法,这样,调用的时候,你就获取到了大类型的ID和小类型的ID,你就可以根据这个ID,来获取你想要的数据了,动态刷新你的下方的listview了。
代码实现的原理大概就是这样子的,可能表达不清楚,那么就直接上代码吧!
package com.kindlion.media.view;
import java.util.ArrayList;
import java.util.List;
import com.kindlion.media.R;
import com.kindlion.media.tool.DataTools;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MyTypeView extends LinearLayout {
/**
* 存储大类型的textview
*/
private List<TextView> titleListView;
/**
* 存储子类型的textview
*/
private List<TextView> childTitleListView;
//大分类的容器
LinearLayout titleLayout;
//横向列表的滑动视图
private HorizontalScrollView mHorizontalScrollView;
private LinearLayout mlayout ;
private Context mContext;
//设置子控件带panddingbottom 和 panddingtop属性的值
private int viewPaddingBottom = 5;
//设置子控件带 PaddingLeft 和 panddingright属性的值
private int viewPaddingLeft = 10;
//大的分类的数据源
List<TypeBean> typeList = new ArrayList<TypeBean>();
//子分类的数据源
List<TypeBean> childTypeList = new ArrayList<TypeBean>();
//纪录子类型选中的id
private int childId = 0;
//纪录大类型选中的位置
private int typeId = 0;
private int topBottom = 0;
private int leftRight = 0;
//判断大类型有没有被点击的锁 ,避免重复的点自己,刷新数据
boolean flag = false; //默认需要不可以触发子类型点点击事件 因为第一次加载点时候已经加载了子类
//是否需要更新子类视图
boolean updateChildEnable = false;
//定义的接口,暴露给外部,实现点击事件的逻辑处理,使用set方法暴露
private onItemClickListener typeItemClickListener;
public MyTypeView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setOrientation(LinearLayout.VERTICAL);
}
/**
* 初次调用 初始化视图
* @param mContext 上下文
* @param typeList 大类型的数据源(这里因为大类型不是HorizontalScrollView,只是一个线性布局,所以数量不宜多)
* @param childTypeList 子类型的数据源
*/
public void OnViewInit(Context mContext,List<