我正在尝试将现有项目移植到 Material Design,但无法理解 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 .但是我真的需要这么大的类只是为了在列表项之间放置简单的分隔符吗?如果我想自己实现代码怎么办?我仍然无法理解
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 作为分隔线。<View android:layout_width="wrap_content" android:layout_height="0.5dip" android:background="@color/light_gray"/>
项目点击监听器也已在第 1 点中解决。 1 以上。
希望对您有所帮助。
关于android - 有没有什么简单的实现或者教程可以在android中实现RecyclerView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29051974/