RecycleView
回顾listview
1.ArrayAdapter
用法: 用来绑定一个数组,支持泛型操作。一般需要根据情况复写getView()方法。
构造函数: ArrayAdapter(Context context, int textViewResourceId, List<T> objects)
第二个参数:必须包含TextView控件的子布局文件 例如:android.R.layout.simple_list_item_1 第三个参数:数据源
2.BaseAdapter
优化:对convertView进行判空,如果为null使用LayoutInflater去加载布局,不为null直接复用。
使用ViewHolder,用于对控件的实例进行缓存,如果convertView为null,创建一个ViewHolder对象,
然后调用View的setTag方法,把viewHolder对象存在view中,如果不为null,直接通过getTag取出。这样
就把所有控件的实例都存在viewholder里,不必每次都通过findviewbyid来获取控件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder viewHolder; if (convertView == null){ view = layoutInflater.inflate(resourceId,parent,false); viewHolder = new ViewHolder(); viewHolder.imageId = (ImageView) view.findViewById(R.id.item_image); viewHolder.text = (TextView) view.findViewById(R.id.item_text); view.setTag(viewHolder); }else { view=convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.imageId.setImageResource(list.get(position).getImageId()); viewHolder.text.setText(list.get(position).getName()); return view; } |
3. SimpleAdapter
数据源一般都是hastMap。
listview添加头,尾,上拉刷新,下拉加载(分页加载)
this.addFooterView(footer);this.addHeaderView(header);
参考:http://www.cnblogs.com/fuly550871915/p/4866985.html
http://blog.csdn.net/allen315410/article/details/39965327
listview没有内容时显示其他view
代码中:(在代码中创建一个View)
1 2 3 4 5 6 7 8 | TextView emptyView = new TextView(this);emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));emptyView.setText("暂无内容");emptyView.setGravity(Gravity.CENTER);emptyView.setVisibility(View.GONE);((ViewGroup)mListView.getParent()).addView(emptyView); mListView.setEmptyView(emptyView); |
在布局文件中,
1 2 3 4 5 6 7 8 9 10 | <com.example.app.MyListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textview" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> |
1 2 3 4 | textView= (TextView) findViewById(R.id.textview);textView.setText("暂无内容");mListView.setEmptyView(textView); |
参考: http://www.cnblogs.com/gzggyy/archive/2013/05/18/3086260.html
RecycleView
导入:compile 'com.android.support:recycleview-v7:25.0.0'
LayoutManager:用于指定RecycleView的布局方式
实现横向:首先对布局文件修改为垂直排列,自己排好控件
然后加载时可以layoutManager里面new 一个LinearManager并设置朝向作为参数
实现网格:GridLayoutManager
实现瀑布流:StaggeredGridManager
瀑布流布局的宽度是根据布局的列数来自动适配的 要各个子项高度不一致才能看出效果
适配器:例如类A继承RecycleView.Adapter<A.ViewHolder>
就是强制要在适配器里面写ViewHolder类,并继承RecycleView.Holder
viewHolder类构造器里传入view,这样就能通过findViewById获取控件实例
类A里构造器传入数据源。要重写onCreateViewHolder()、onBindViewHolder()、getItemCount()三个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>{ private List<Fruit> olist; public MyAdapter2(List<Fruit> list) { this.olist = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.imageView.setImageResource(olist.get(position).getImageId()); holder.textView.setText(olist.get(position).getName()); } @Override public int getItemCount() { return olist.size(); } static class ViewHolder extends RecyclerView.ViewHolder{ ImageView imageView; TextView textView; //构造器传入View对象 public ViewHolder(View itemView) { super(itemView); imageView = (ImageView) itemView.findViewById(R.id.item_image); textView = (TextView) itemView.findViewById(R.id.item_text); } }} |
RecycleView的点击事件
为什么RecycleView没有点击事件:
ListView的点击事件实现点击条目里的具体的 一个控件非常麻烦,为此,RecycleView摒弃了子项的点击事件的监听器,所有的点击事件都由具体的View去注册。
实现:在ViewHolder里定义一个变量保存子项最外层view的实例
然后再onCreate里通过viewHolder.outView.setOnClickListener监听,同样viewHolder对象还能通过getAdapterPosition()拿到位置。
1 2 3 4 5 6 7 8 | holder.outView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = holder.getAdapterPosition(); Fruit fruit = olist.get(position); Toast.makeText(v.getContext(), "你点击了条目:"+fruit.getName(), Toast.LENGTH_SHORT).show(); } }); |

浙公网安备 33010602011771号