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();
           }
       });


posted @ 2021-10-18 19:09  知行合一948  阅读(177)  评论(0)    收藏  举报