在android studio中RecyclerView的使用和遇到的问题(记录):
2017-03-16 09:49
585 查看
关于在android studio使用RecyclerView遇到的问题:
RecyclerView没有提供onItemClickListener方法,那就自己写一个:
ItemDecoration
Decoration意为修饰,ItemDecoration允许程序添加自定义的绘画或者布局边距,常用于分割列表子项,突显视觉上的界限。这类似于listView中的devider,但listView中所画的分割线是在Listview内部实现,对于开发者来说,灵活性较低。在新的RecyclerView中很好的解决这个问题,RecycView把对Decoration的控制交给了开发者,RecyclerView默认不带Decoration
http://geek.csdn.net/news/detail/186211
主Activity代码:
1.集成问题:
在布局文件中找不到在android.support.v7.widget包中的RecyclerView,看了一下sdk manager发现support library 是最新的,无法更新.... 在项目里面add library dependence也找不到v7包下的RecyclerView.... 于是问了波度娘,找到了解决方法..... a.查看android studio 项目下external libraries中的appcompat-v7-xx.xx.xx... 查看libraries properties,查看到这个包在电脑中的路径... (E:\sdk\extras\android\m2repository\com\android\support)... 在电脑中打开这个路径,发现了一个recyclerview-v7 文件,按理说我们的sdk文件中已经存在了recyclerview.... b.在项目的app文件夹下的build gradle中添加..... compile 'com.android.support:recyclerview-v7:xx.x.x'... 就可以了,添加完了syn now一下,发现项目没有报错... 在布局文件中添加布局android.support.v7.widget.RecyclerView... 设置属性,运行项目,ok...
2.基本代码
适配器:继承RecyclerView.Adapter(MyRecyclerViewAdapter.ViewHolder)这里的泛型需要是自己定义的ViewHolder(继承RecyclerView.ViewHolder),重写方法。这里需要注意一下,因为RecyclerView没有OnItemClick方法,需要使用此方法的时候需要自定义一个抽象类,通过在适配器里面调用view的onClick方法启动,view的onclick方法一定需要放在new viewholder 代码里面,否则点击不触发事件(这里的坑我找了很久才找到)/** * 适配器 */ public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> implements View.OnClickListener{ private List<String> mData; public MyRecyclerViewAdapter(List<String> mData) { this.mData = mData; } private OnRecyclerViewItemClickListener itemClickListener = null; private int mCurrentItemId = 0; @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pack_one_recyclerview,parent,false); //创建ViewHolder ViewHolder viewHolder = new ViewHolder(view); //RecyclerView的Item点击事件 vi 4000 ew.setOnClickListener(this); viewHolder.tv = (TextView) view.findViewById(R.id.item_pack_one_tv); viewHolder.iv = (ImageView) view.findViewById(R.id.item_pack_one_iv); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.iv.setImageResource(R.drawable.ic_launcher); holder.tv.setText(mData.get(position)); holder.itemView.setTag(position); } @Override public int getItemCount() { return mData.size(); } @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemclick(v, (Integer) v.getTag()); } } class ViewHolder extends RecyclerView.ViewHolder { public ImageView iv; public TextView tv; public ViewHolder(View itemView) { super(itemView); } } public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.itemClickListener = listener; } }
RecyclerView没有提供onItemClickListener方法,那就自己写一个:
public interface OnRecyclerViewItemClickListener { void onItemclick(View view,int position); }
ItemDecoration
Decoration意为修饰,ItemDecoration允许程序添加自定义的绘画或者布局边距,常用于分割列表子项,突显视觉上的界限。这类似于listView中的devider,但listView中所画的分割线是在Listview内部实现,对于开发者来说,灵活性较低。在新的RecyclerView中很好的解决这个问题,RecycView把对Decoration的控制交给了开发者,RecyclerView默认不带Decoration
http://geek.csdn.net/news/detail/186211
/** * 间隔线 */ public class MyDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; private Drawable diliver; private int mOrientation; public MyDecoration(Context context, int mOrientation) { final TypedArray typedArray = context.obtainStyledAttributes(ATTRS); diliver = typedArray.getDrawable(0); typedArray.recycle(); this.mOrientation = mOrientation; } /** * * @param c * @param parent */ @Override public void onDrawOver(Canvas c, RecyclerView parent) { super.onDrawOver(c, parent); } /** * * @param c * @param parent * @param state */ @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); //为横向布局的RecyclerView的每个Item设置下划线 if (mOrientation == LinearLayoutManager.VERTICAL){ //左边开始画的地方 final int left = parent.getPaddingLeft(); //画到右边的地方(总宽减去右内边距) final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0;i<childCount;i++){ final View childAt = parent.getChildAt(i); final RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) childAt.getLayoutParams(); final int top = childAt.getTop() - layoutParams.topMargin; final int bottom = top + diliver.getIntrinsicHeight(); diliver.setBounds(left,top,right,bottom); diliver.draw(c); } } } }
主Activity代码:
public class PackOneActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> mData; private MyRecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pack_one); initView(); initData(); initEvent(); } private void initView() { recyclerView = (RecyclerView) this.findViewById(R.id.pack_one_ry); } private void initData() { mData = new ArrayList<>(); for (int i = 0; i < 100; i++) { mData.add("Item" + i); } //创建适配器 adapter = new MyRecyclerViewAdapter(mData); //设置适配器 recyclerView.setAdapter(adapter); //创建一个线性布局管理器 LinearLayoutManager manger = new LinearLayoutManager(this); //设置方向 manger.setOrientation(LinearLayoutManager.VERTICAL); //设置布局管理器 recyclerView.setLayoutManager(manger); //这里我是想看一下加间隔线跟不加间隔线的区别 if (getIntent().getFlags() != 1){ //创建布局边距 MyDecoration decoration = new MyDecoration(this,LinearLayoutManager.VERTICAL); //设置 recyclerView.addItemDecoration(decoration); } //设置item动画 (默认:渐隐) recyclerView.setItemAnimator(new DefaultItemAnimator()); } private void initEvent() { //item的点击事件 adapter.setOnItemClickListener(new OnRecyclerViewItemClickListener() { @Override public void onItemclick(View view, int position) { Toast.makeText(PackOneActivity.this,"点击:"+mData.get(position),Toast.LENGTH_SHORT).show(); } }); } }
相关文章推荐
- 使用v7包中的recyclerview遇到的问题简单记录一下
- 关于使用RecyclerView遇到的一些问题集合
- recyclerview导入到android studio中遇到的问题
- 使用Recyclerview控件遇到的一些问题
- RecyclerView使用xRefreshView时遇到的问题
- Android RecyclerView的使用过程遇到的问题
- 使用Recyclerview 遇到No adapter attached; skipping layout 问题
- 记录Android studio使用过程中遇到的问题
- RecyclerView GridLayoutManager 使用遇到的问题
- 导入 SwipRecyclerView 遇到的问题记录
- 使用RecyclerView遇到的一些问题 Inconsistency detected
- RecyclerView遇到的问题记录
- android studio使用中遇到的问题记录
- RecyclerView使用过程中遇到的几点问题
- 电视TV端使用RecyclerView开发遇到的问题
- RecyclerView使用时遇到的问题
- 继承RecyclerView.Adapter使用泛型遇到的问题
- RecyclerView使用中遇到的问题
- 使用RecyclerView中遇到的问题
- Android Studio使用中遇到问题解决记录