是否有任何简单的实现或教程可以在 android 中实现 RecyclerView? [英] Is there any simple implementation or tutorial to implement RecyclerView in android?
问题描述
我正在尝试将现有项目移植到 Material Design,但无法理解 RecyclerView 的实现.我的旧代码使用 ListView,但我想要像列表一样的 GMail 应用程序.
I am trying to port my existing project to material design but am unable to understand the implementation of RecyclerView. My old code uses a ListView but I want GMail app like lists.
我已经阅读了大量教程,但其中大部分要么跳过了ItemDecoration
部分或ClickListener
部分.不同的教程有完全不同的实现,代码也各不相同,以至于我无法理解该放在哪里.
I have read tons of tutorials but most of them either skip the ItemDecoration
part or the ClickListener
part. Different tutorials have entirely different implementations and code varies to the point that I am unable to understand where to put what.
我在以下方面苦苦挣扎,这是我通过阅读各种教程编写的:
I am struggling in the following, which I compiled by reading various tutorials:
适配器:我的适配器代码如下:
Adapter: My adapter code is the following:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private final Context mContext;
private List<String> mData1, mData2;
public MyAdapter(Context mContext, String[] data1,String[] data2) {
this.mContext = mContext;
if (data1 != null)
mData1 = new ArrayList<String>(Arrays.asList(data1));
else mData1 = new ArrayList<String>();
if (data2 != null)
mData2 = new ArrayList<String>(Arrays.asList(data2));
else mData2 = new ArrayList<String>();
}
public void add(String s,int position) {
position = position == -1 ? getItemCount() : position;
mData1.add(position,s);
notifyItemInserted(position);
}
public void remove(int position){
if (position < getItemCount() ) {
mData1.remove(position);
notifyItemRemoved(position);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View itemView = inflater.inflate(R.layout.list_item,viewGroup,false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int position) {
myViewHolder.tv1.setText(mData1.get(position));
myViewHolder.tv2.setText(mData2.get(position));
myViewHolder.setClickListener(new MyViewHolder.ClickListener()
{
@Override
public void onClick(View v, int pos) {
Toast.makeText(mContext,"The selected position is: "+ pos,Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mData1.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
protected TextView tv1;
protected TextView tv2;
ClickListener clickListener;
public MyViewHolder(View itemView) {
super(itemView);
tv1 = (TextView) itemView.findViewById(R.id.txt1);
tv2 = (TextView) itemView.findViewById(R.id.txt2);
}
@Override
public void onClick(View v) {
}
public void onClick(View v, int pos)
{
clickListener.onClick(v,getPosition());
}
public void setClickListener(ClickListener clickListener)
{
this.clickListener = clickListener;
}
public interface ClickListener
{
public void onClick(View v,int pos);
}
}
}
ItemDecoration
是从这里复制的:https://gist.github.com/alexfu/0f464fc3742f134ccd1e.但是我真的需要这么大的类来在列表项之间放置简单的分隔符吗?如果我想自己实现代码怎么办?
The ItemDecoration
is copied from here: https://gist.github.com/alexfu/0f464fc3742f134ccd1e. But do I really need such a large class just to put simple dividers between list items? What if I wanted to implement the code on my own?
我仍然无法弄清楚 OnClickListener
.首先,我想要一个简单的 OnClickListener
,就像 ListView.OnClickListener
.当前的 OnClickListener
是从教程编译的,但不起作用.
I still cannot figure out the OnClickListener
. For a start, the I want a simple OnClickListener
just like ListView.OnClickListener
. The current OnClickListener
was compiled from a tutorial but does not work.
完整代码在这里:https://github.com/pauldmps/MaterialDesign/
推荐答案
RecyclerView 适配器示例:
适配器问题可以使用以下代码解决:
Adapter issue can be solved using below code:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
private final Context mContext;
private List<String> mData1, mData2;
public MyAdapter(Context mContext, String[] data1, String[] data2) {
this.mContext = mContext;
if (data1 != null)
mData1 = new ArrayList<String>(Arrays.asList(data1));
else
mData1 = new ArrayList<String>();
if (data2 != null)
mData2 = new ArrayList<String>(Arrays.asList(data2));
else
mData2 = new ArrayList<String>();
}
public void add(String s, int position) {
position = position == -1 ? getItemCount() : position;
mData1.add(position, s);
notifyItemInserted(position);
}
public void remove(int position) {
if (position < getItemCount()) {
mData1.remove(position);
notifyItemRemoved(position);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, final int position) {
myViewHolder.tv1.setText(mData1.get(position));
myViewHolder.tv2.setText(mData2.get(position));
myViewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
clickListener.onClick(v, position);
}
});
}
@Override
public int getItemCount() {
return mData1.size();
}
ClickListener clickListener;
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public interface ClickListener {
public void onClick(View v, int pos);
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
protected TextView tv1;
protected TextView tv2;
public MyViewHolder(View itemView) {
super(itemView);
tv1 = (TextView) itemView.findViewById(R.id.txt1);
tv2 = (TextView) itemView.findViewById(R.id.txt2);
}
}
}
用法如下:
MyAdapter adapter=....;
adapter.setClickListener(new ClickListener() {
@Override
public void onClick(View v, int pos) {
// do whatever you want
}
});
没有任何简单的方法可以做到这一点.但我会建议你一个解决方法.在
list_item.xml
的底部添加下面的视图作为分隔线.
There is not any Simple way to do that. But i would suggest you one workaround for this. Add below view as a divider at the bottom inside your
list_item.xml
.
<View
android:layout_width="wrap_content"
android:layout_height="0.5dip"
android:background="@color/light_gray"/>
项目点击监听器也在第 1 点解决.1 以上.
Item click listener is also resolved in point no. 1 above.
希望对你有帮助.
这篇关于是否有任何简单的实现或教程可以在 android 中实现 RecyclerView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!