layout: post
title: "新控件笔记"
date: 2016-08-16 12:16:58 +0800
comments: true
categories:
RecyclerView##
- 此控件还需要在app的gradle中添加依赖才能使用
- RecyclerView 控件是用来替换ListView的,此控件并不会像ListView默认加分割线,而且并没有setOnItemClickListener()方法。
- RecyclerView控件主要由这几部分构成
-
LinearLayoutManager:主要用于制Recyclerview的子项之间的放置方式。
layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecycler.setLayoutManager(layoutManager);
-
自定义适配器类,继承RecyclerView.Adapter<MHolder> ,泛型放入的为子项布局view的持有对象类。
public HomeAdapter(Context context,List<String> list){ this.context = context; this.dataList = list; } @Override public HomeHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1,parent,false); view.setOnClickListener(this); //此为注册子项布局View的点击监听者。 return new HomeHolder(view); } //此方法用于创建子项布局View持有者对象。 @Override public void onBindViewHolder(HomeHolder holder, int position) { String content = dataList.get(position); holder.setTextView(content); holder.itemView.setTag(content); //用于封存子View 对应的实体类对象。 } //此方法呢在RececlerView绘制子项布局View 时就会回调到,所以其中的主要逻辑用于设置View 内容。 @Override public int getItemCount() { return dataList.size(); } //此方法用于表示RececlerView显示多少个子项布局内容。所以一般返回存放实体类的List容器.size()就能显示全部了。
自定义View持有类,继承于RecyclerView.ViewHolder,用于持有子项布局View对象,提高RececlerView的效率。
-
Insert Your Code Here.
``` private TextView textView;
public HomeHolder(View itemView) {
super(itemView);
textView =(TextView) itemView.findViewById(android.R.id.text1);
} //构造函数用于获取子项布局下的UI控件
public void setTextView(String text){
textView.setText(text);
}
+ 子项布局用于RecyclerView的单项UI。
+ List容器用于放置实体类。实体类单项UI的资源对象。当List容器里的对象数发生改变了,只需调用mAdapter.mAdapter.notifyDataSetChanged(),新的内容就能绘制到屏幕上了。
+ 当要在RececlerView中实现多Item布局时呢,就需要注意使用onCreateViewHolder(ViewGroup parent,int viewType)的第二参数,可以根据ViewType来决定创建哪个ViewHolder。用getItemViewType()设置什么条件(位置)下返回 哪个值并传给ViewType。然后到onBindViewHolder( )方法下去对当前的holder实例进行判断。getItemViewType(int position)方法表示position值的子项视图是什么。getItemViewType()方法会当有子项视图绘制时是都会被调用,如返回的是一个新值(返回到ViewType中,跟之前对比不同),就会去回调onCreateViewHolder( )方法创建新的ViewHolder对象。
//列表元素private static final int TYPE_ITEM = 0;
//脚布局private static final int TYPE_FOOTER = 1;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View root = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_news_item, parent, false);
return new ItemViewHolder(root);
} else {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_listview_footer, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
return new FooterViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TextViewHolder) {
((TextViewHolder) holder).mTextView.setText(mTitles[position]);
} else if (holder instanceof ImageViewHolder) {
((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
}
}
@Override
public int getItemViewType(int position) {
return position > 50 ? TYPE_ITEM:TYPE_FOOTER;
}
+ 当子项布局的高度是固定时,调用此 mRecycler.setHasFixedSize(true); 可提高性能。
+ 因Recycler默认子项布局之间没有分割线,所以这条分割线就需要,在编写子项布局xml文件时加入。
如子项布局之间的排放是垂直的话,分割线以横线的形式放置,如子项布局之间的排放是水平的话,分割线以竖线的形式放置。
+ 因Recycler默认没有每个项目的点击事件接口。所以需要到Adapter中添加,不能直接在Recycler中的onClick中加入,会破化代码的逻辑。
+ 在适配器类的中onCreatViewHolder()中为每个子项View注册setOnClickListener(),并在Onclik()中回调公开ItemClick接口,并把子项布局的实体类传给调用者,调用者在实体类写自己的逻辑
@Overridepublic void onBindViewHolder(HomeHolder holder, int position) {
String content = dataList.get(position);
holder.setTextView(content);
holder.itemView.setTag(content); //把item对应的实体类传给itemView,方便点击事件发生时得到对应的资源。
}
public static interface OnRecyclerViewItemClick{
void OnItemClick(View v,String data);
}
@Override
public void onClick(View view) {
if(mOnItemClick != null){
mOnItemClick.OnItemClick(view,(String) view.getTag());
}
}
public void setOnItemClickListener(OnRecyclerViewItemClick listener){
mOnItemClick = listener;
}//外部接口。
### SwipeRefreshLayout
+ 这是一个刷新布局控件,意为此布局下的控件当有下拉滑动动作时,就能产生刷新事件。
mRefreshl.setOnRefreshListener(this);
@Override
public void onRefresh() {
if(LEVE_L == 0 ){
queryProvince();
}else if(LEVE_L == 1){
queryCounty(false);
}
mRefreshl.postDelayed(new Runnable() {
@Override
public void run() {
if(LEVE_L == 0 )
Toast.makeText(context, "刷新市级列表成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(context, "刷新县级列表成功", Toast.LENGTH_SHORT).show();
mRefreshl.setRefreshing(false);
}
},3000); //此控件呢在变为刷新状态后一定要取消。
}
postDelayed()方法,接收两个参数,第一参数为毫秒时间到执行的任务(默认主线程执行),第二参数为延时的时间。
+ mRefre.setColorSchemeResources( );此接口用于设置旋转条的颜色。可传入一组颜色的id