RecycleView在eclipse的初体验
在sdk中找到v7包
\sdk\extras\android\support\v7\recyclerview
导入工程
Import\Android\Existing Android Code Into Workspace
将导入的recycleview作为依赖库Library
工程上右键properties,勾选is Library,Apply,ok
将recycleview\libs\android_support_v7_recycleview.jar包复制粘贴到主工程的libs文件夹下
在layout中使用<android.support.v7.widget.RecyclerView/>标签
MainActivity
1 package com.jiatu.recyclerviewtest; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import android.app.Activity; 6 import android.content.Context; 7 import android.content.res.TypedArray; 8 import android.graphics.Canvas; 9 import android.graphics.Rect; 10 import android.graphics.drawable.Drawable; 11 import android.os.Bundle; 12 import android.support.v7.widget.DefaultItemAnimator; 13 import android.support.v7.widget.LinearLayoutManager; 14 import android.support.v7.widget.RecyclerView; 15 import android.view.LayoutInflater; 16 import android.view.View; 17 import android.view.ViewGroup; 18 import android.widget.TextView; 19 import android.widget.Toast; 20 21 public class MainActivity extends Activity { 22 private RecyclerView recyclerView; 23 private List<Person> list = new ArrayList<Person>(); 24 private LinearLayoutManager mLayoutManager; 25 // private GridLayoutManager mGridLayoutManager; 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); 32 recyclerView.setHasFixedSize(true); // 固定item的高或者宽,提高性能 33 recyclerView.setItemAnimator(new DefaultItemAnimator()); 34 recyclerView.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST)); 35 36 mLayoutManager = new LinearLayoutManager(this); 37 // 设置list的方向,默认是垂直 38 // mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 39 40 // 5,spanCount:列数 41 // mGridLayoutManager = new GridLayoutManager(this, 5); 42 43 recyclerView.setLayoutManager(mLayoutManager); 44 45 initData(); 46 setPersonAdapter(); 47 48 } 49 50 /** 51 * 设置适配器 52 */ 53 private void setPersonAdapter() { 54 final PersonAdapter adapter = new PersonAdapter(this, list); 55 adapter.setOnRecyclerViewListener(new OnRecyclerViewListener() { 56 57 @Override 58 public boolean onItemLongClick(int position) { 59 adapter.addData(position); 60 Toast.makeText(MainActivity.this, "吼吼吼吼吼", Toast.LENGTH_SHORT).show(); 61 return true; 62 } 63 64 @Override 65 public void onItemClick(int position) { 66 adapter.removeData(position); 67 Toast.makeText(MainActivity.this, "哈哈哈哈哈", Toast.LENGTH_SHORT).show(); 68 } 69 }); 70 71 recyclerView.setAdapter(adapter); 72 } 73 74 /** 75 * RecyclerView的单击和长按事件监听 76 * 77 * @author fans created on 2016年11月3日 78 * 79 */ 80 public interface OnRecyclerViewListener { 81 void onItemClick(int position); 82 83 boolean onItemLongClick(int position); 84 } 85 86 /** 87 * 适配器 88 * 89 * @author fans created on 2016年11月3日 90 * 91 */ 92 class PersonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 93 94 private OnRecyclerViewListener onRecyclerViewListener; 95 96 public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) { 97 this.onRecyclerViewListener = onRecyclerViewListener; 98 } 99 100 private List<Person> list = new ArrayList<Person>(); 101 private Context context; 102 103 public PersonAdapter(Context context, List<Person> list) { 104 this.context = context; 105 this.list = list; 106 } 107 108 /** 109 * 增加一个item 110 * 111 * @param position 112 */ 113 public void addData(int position) { 114 list.add(position, new Person("fans+", 23)); 115 notifyItemInserted(position); 116 notifyItemRangeChanged(position, list.size()); 117 } 118 119 /** 120 * 删减一个item 121 * 122 * @param position 123 */ 124 public void removeData(int position) { 125 list.remove(position); 126 notifyDataSetChanged(); 127 notifyItemRemoved(position); 128 notifyItemRangeChanged(position, list.size()); 129 } 130 131 @Override 132 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) { 133 View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false); 134 return new PersonViewHolder(view); 135 } 136 137 @Override 138 public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { 139 PersonViewHolder holder = (PersonViewHolder) viewHolder; 140 holder.position = i; 141 Person person = list.get(i); 142 holder.tv.setText(person.name); 143 144 } 145 146 @Override 147 public int getItemCount() { 148 return list.size(); 149 } 150 151 /** 152 * 自定义holder 153 * 154 * @author fans created on 2016年11月4日 155 * 156 */ 157 class PersonViewHolder extends RecyclerView.ViewHolder 158 implements View.OnClickListener, View.OnLongClickListener { 159 public View rootView; 160 TextView tv; 161 public int position; 162 163 public PersonViewHolder(View itemView) { 164 super(itemView); 165 tv = (TextView) itemView.findViewById(R.id.list_item); 166 rootView = itemView.findViewById(R.id.recycler_view_test_item_person_view); 167 rootView.setOnClickListener(this); 168 rootView.setOnLongClickListener(this); 169 } 170 171 @Override 172 public void onClick(View v) { 173 if (null != onRecyclerViewListener) { 174 onRecyclerViewListener.onItemClick(position); 175 } 176 } 177 178 @Override 179 public boolean onLongClick(View v) { 180 if (null != onRecyclerViewListener) { 181 return onRecyclerViewListener.onItemLongClick(position); 182 } 183 return false; 184 } 185 } 186 187 } 188 189 /** 190 * 填充数据 191 */ 192 private void initData() { 193 for (int i = 0; i < 10; i++) { 194 list.add(new Person("fans" + i, 10 + i)); 195 } 196 } 197 198 class Person { 199 public String name; 200 public int age; 201 202 public Person(String name, int age) { 203 super(); 204 this.name = name; 205 this.age = age; 206 } 207 208 } 209 210 /** 211 * 自定义的分割线 212 * 213 * @author fans created on 2016年11月4日 214 * 215 */ 216 class MyDecoration extends RecyclerView.ItemDecoration { 217 218 private Context mContext; 219 private Drawable mDivider; 220 private int mOrientation; 221 public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; 222 public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; 223 224 // 我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置 225 public final int[] ATRRS = new int[] { android.R.attr.listDivider }; 226 227 public MyDecoration(Context context, int orientation) { 228 this.mContext = context; 229 final TypedArray ta = context.obtainStyledAttributes(ATRRS); 230 this.mDivider = ta.getDrawable(0); 231 ta.recycle(); 232 setOrientation(orientation); 233 } 234 235 // 设置屏幕的方向 236 public void setOrientation(int orientation) { 237 if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { 238 throw new IllegalArgumentException("invalid orientation"); 239 } 240 mOrientation = orientation; 241 } 242 243 @Override 244 public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 245 if (mOrientation == HORIZONTAL_LIST) { 246 drawVerticalLine(c, parent, state); 247 } else { 248 drawHorizontalLine(c, parent, state); 249 } 250 } 251 252 // 画横线, 这里的parent其实是显示在屏幕显示的这部分 253 public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { 254 int left = parent.getPaddingLeft(); 255 int right = parent.getWidth() - parent.getPaddingRight(); 256 final int childCount = parent.getChildCount(); 257 for (int i = 0; i < childCount; i++) { 258 final View child = parent.getChildAt(i); 259 260 // 获得child的布局信息 261 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 262 final int top = child.getBottom() + params.bottomMargin; 263 final int bottom = top + mDivider.getIntrinsicHeight(); 264 mDivider.setBounds(left, top, right, bottom); 265 mDivider.draw(c); 266 // Log.d("wnw", left + " " + top + " "+right+" "+bottom+" "+i); 267 } 268 } 269 270 // 画竖线 271 public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { 272 int top = parent.getPaddingTop(); 273 int bottom = parent.getHeight() - parent.getPaddingBottom(); 274 final int childCount = parent.getChildCount(); 275 for (int i = 0; i < childCount; i++) { 276 final View child = parent.getChildAt(i); 277 278 // 获得child的布局信息 279 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 280 final int left = child.getRight() + params.rightMargin; 281 final int right = left + mDivider.getIntrinsicWidth(); 282 mDivider.setBounds(left, top, right, bottom); 283 mDivider.draw(c); 284 } 285 } 286 287 // 由于Divider也有长宽高,每一个Item需要向下或者向右偏移 288 @Override 289 public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 290 if (mOrientation == HORIZONTAL_LIST) { 291 // 画横线,就是往下偏移一个分割线的高度 292 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); 293 } else { 294 // 画竖线,就是往右偏移一个分割线的宽度 295 outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); 296 } 297 } 298 } 299 }
layout
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context="${relativePackage}.${activityClass}" > 6 7 <android.support.v7.widget.RecyclerView 8 android:id="@+id/recycler_view_test_rv" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:background="#bbccaa" 12 android:scrollbars="vertical" /> 13 14 </RelativeLayout>
item
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/recycler_view_test_item_person_view" 4 android:layout_width="match_parent" 5 android:layout_height="50dp" 6 android:layout_margin="16sp" 7 android:orientation="vertical" > 8 9 <TextView 10 android:id="@+id/list_item" 11 android:layout_width="match_parent" 12 android:layout_height="match_parent" 13 android:background="#08da1d" 14 android:gravity="center" 15 android:textColor="#f7f4f7" 16 android:textSize="20sp" /> 17 18 </LinearLayout>
浙公网安备 33010602011771号