实现一个可以横向滑动的上述效果, 并且点击条目会吐司该相片。
第一步: 导包。在Android Studio中的build.gradle中
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.support:recyclerview-v7:23.3.0' compile 'com.android.support:cardview-v7:23.3.0' }在dependencies中加上两条分别为recyclerview和cardview的v7包。
第二步:在主界面的布局文件中定义RecyclerView。
<android.support.v7.widget.RecyclerView android:id = "@+id/rv" android:layout_width = "match_parent" android:layout_height = "wrap_content"> </android.support.v7.widget.RecyclerView>
第三步:新建一个RecyclerView所需要的布局文件。
这里用CardView来展示。CardView相当于FrameLayout。根节点也需要android.support.v7.widget.CardView。
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/cv" card_view:cardCornerRadius="20dp" card_view:cardBackgroundColor="#66B3FF" android:layout_marginTop="10dp" >card_view:cardCornerRadius表示卡片圆角半径。
新建一个bean包新建一个Person类,里面定义两个参数int id即相片的id,还有String name即清朝皇帝的名字。getset方法。
public Person(int id,String name){ setImage(id); setName(name); }构造方法传入相片id和皇帝名字,并set保存。
第四步: 1、新建一个recyclerview所需的适配器即新建一个类继承RecyclerView.Adapter<子类名.ViewHolder>。
实现三个方法。
2、创建构造函数初始化数据:
private ArrayList<Person> list; private Context myContext ; private LayoutInflater layoutInflater; public MyRecyclerViewAdapter(Context context){ myContext = context; layoutInflater = LayoutInflater.from(context); list = new ArrayList<Person>(); list.add(new Person(R.drawable.qing1,"清太祖")); list.add(new Person(R.drawable.qing2,"清太宗")); list.add(new Person(R.drawable.qing3,"清世祖顺治")); list.add(new Person(R.drawable.qing4,"清圣祖康熙"));将数据放到集合中。
3、实现的第一个方法:提供Recycler所需的view,通过LayoutInflater将布局加载进来。返回一个ViewHolder对象,通过ViewHolder的构造函数,将view传给ViewHolder。
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = layoutInflater.inflate(R.layout.recyclerview,parent,false); return new ViewHolder(itemView); }
4、然后创建内部类ViewHolder继承RecyclerView.ViewHolder。
ViewHolder的目的是暂存RecyclerView中的view,以便之后重复使用。
public class ViewHolder extends RecyclerView.ViewHolder{ private ImageView iv; private TextView tv; public ViewHolder(View itemView) { super(itemView); iv = (ImageView) itemView.findViewById(R.id.iv); tv = (TextView) itemView.findViewById(R.id.tv); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getAdapterPosition() == RecyclerView.NO_POSITION){ Toast.makeText(myContext,"Please click the item again",Toast.LENGTH_SHORT).show(); return; } ImageView imageView = new ImageView(myContext); imageView.setImageResource(list.get(getAdapterPosition()).getImage()); Toast toast = new Toast(myContext); toast.setView(imageView); toast.setDuration(Toast.LENGTH_SHORT); toast.show(); } }); } public ImageView getImageView(){ return iv; } public TextView getTextView(){ return tv; } }
上页部分疑惑代码讲解:
RecyclerView无法像ListView/GridView一样注册OnItemClickListener,
如果仍要监听选项是否被单击了,可以为View注册OnClickListener并通过
getAdapterPosition()来获取被单击项的位置,不过可能返回RecyclerView.NO_POSITION,因此建议检查。
当开发者调用Recycler.Adapter.notifyDataSetChanged()刷新页面时,而选项的View没有实时传入就回到RecyclerView.NO_POSITION。
在点击方法中先判断是否为no_position,否则就新建一个ImageView赋给Toast。
ViewHolder中提供方法将控件给一下方法获取。
5、实现的另外两个方法。
要显示RecyclerView中特定position的数据时会执行第一个方法。
第二个方法表示RecyclerView要显示的数目。
@Override public void onBindViewHolder(ViewHolder holder, int position) { Person person = list.get(position); holder.getImageView().setImageResource(person.getImage()); holder.getTextView().setText(person.getName()); } @Override public int getItemCount() { return list.size(); }
最后一步:在主界面中找到RecycleView控件。
设置LayoutManager。再设置适配器。
RecyclerView rv = (RecyclerView) findViewById(R.id.rv); rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL)); rv.setAdapter(new MyRecyclerViewAdapter(this));这里用StaggeredGridLayoutManager样式,并且设置成水平的。
本文介绍如何在Android应用中实现带有横向滑动效果的RecyclerView组件,并详细解释了从依赖引入到自定义适配器及点击事件处理的全过程。
825

被折叠的 条评论
为什么被折叠?



