android有没有简单的实现RecyclerView的实现或者教程?
Is there any simple implementation or tutorial to implement RecyclerView in android?
我正在尝试将我现有的项目移植到 material 设计中,但我无法理解 RecyclerView 的实现。我的旧代码使用 ListView,但我想要 GMail 应用程序,如列表。
我已经阅读了大量教程,但其中大部分要么跳过 ItemDecoration
部分,要么跳过 ClickListener
部分。不同的教程有完全不同的实现,代码各不相同,以至于我无法理解把什么放在哪里。
我在下面挣扎,这是我通过阅读各种教程整理的:
适配器:我的适配器代码如下:
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。但是我真的需要这么大的 class 只是为了在列表项之间放置简单的分隔符吗?如果我想自己实现代码怎么办?
我还是想不通OnClickListener
。首先,我想要一个简单的 OnClickListener
,就像 ListView.OnClickListener
。当前的 OnClickListener
是根据教程编译的,但不起作用。
RecyclerView Adapter Example:
可以使用以下代码解决适配器问题:
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
.
的底部添加下方视图作为分隔线
<View
android:layout_width="wrap_content"
android:layout_height="0.5dip"
android:background="@color/light_gray"/>
项目点击监听器也已在第 1 点中解决。 1 以上.
希望对您有所帮助。
这是使用简单库简单实现 RecyclerView 的示例
在build.gradle
中添加这一行
implementation 'com.hereshem.lib:awesomelib:2.0.1'
在 Activity 中使用
创建 RecyclerView 布局
<com.hereshem.lib.recycler.MyRecyclerView
android:id="@+id/recycler"
app:layoutManager="LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
通过传递 class 它支持的
创建一个 ViewHolder
public static class EVHolder extends MyViewHolder<Events> {
TextView date, title, summary;
public EVHolder(View v) {
super(v);
date = v.findViewById(R.id.date);
title = v.findViewById(R.id.title);
summary = v.findViewById(R.id.summary);
}
@Override
public void bindView(Events c) {
date.setText(c.date);
title.setText(c.title);
summary.setText(c.summary);
}
}
用很少的几行创建项目列表变量和适配器
List<Events> items = new ArrayList<>();
MyRecyclerView recycler = findViewById(R.id.recycler);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event);
recycler.setAdapter(adapter);
可以使用以下行添加 ClickListener
recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show();
}
});
可以找到更多示例here
希望这对您有所帮助:)
我正在尝试将我现有的项目移植到 material 设计中,但我无法理解 RecyclerView 的实现。我的旧代码使用 ListView,但我想要 GMail 应用程序,如列表。
我已经阅读了大量教程,但其中大部分要么跳过 ItemDecoration
部分,要么跳过 ClickListener
部分。不同的教程有完全不同的实现,代码各不相同,以至于我无法理解把什么放在哪里。
我在下面挣扎,这是我通过阅读各种教程整理的:
适配器:我的适配器代码如下:
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。但是我真的需要这么大的 class 只是为了在列表项之间放置简单的分隔符吗?如果我想自己实现代码怎么办?我还是想不通
OnClickListener
。首先,我想要一个简单的OnClickListener
,就像ListView.OnClickListener
。当前的OnClickListener
是根据教程编译的,但不起作用。
RecyclerView Adapter Example:
可以使用以下代码解决适配器问题:
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
.<View android:layout_width="wrap_content" android:layout_height="0.5dip" android:background="@color/light_gray"/>
项目点击监听器也已在第 1 点中解决。 1 以上.
希望对您有所帮助。
这是使用简单库简单实现 RecyclerView 的示例
在build.gradle
implementation 'com.hereshem.lib:awesomelib:2.0.1'
在 Activity 中使用
创建 RecyclerView 布局<com.hereshem.lib.recycler.MyRecyclerView
android:id="@+id/recycler"
app:layoutManager="LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
通过传递 class 它支持的
创建一个 ViewHolderpublic static class EVHolder extends MyViewHolder<Events> {
TextView date, title, summary;
public EVHolder(View v) {
super(v);
date = v.findViewById(R.id.date);
title = v.findViewById(R.id.title);
summary = v.findViewById(R.id.summary);
}
@Override
public void bindView(Events c) {
date.setText(c.date);
title.setText(c.title);
summary.setText(c.summary);
}
}
用很少的几行创建项目列表变量和适配器
List<Events> items = new ArrayList<>();
MyRecyclerView recycler = findViewById(R.id.recycler);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event);
recycler.setAdapter(adapter);
可以使用以下行添加 ClickListener
recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show();
}
});
可以找到更多示例here
希望这对您有所帮助:)