您的位置:首页 > 移动开发 > Android开发

在android studio中RecyclerView的使用和遇到的问题(记录):

2017-03-16 09:49 585 查看
关于在android studio使用RecyclerView遇到的问题:

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: