基于RecyclerView实现ViewPager的功能(横向)
来源:互联网 发布:南非经济数据 编辑:程序博客网 时间:2024/06/08 10:23
说下大概思想吧,RecyclerView的使用大家都很熟悉了(不熟悉的请自行百度),在做项目的时候,需要实现一个图片界面横向滑动的功能,之前用RecycleView时一直做的都是垂直滑动的,当然使用ViewPager可以轻易完成。然而我就是想用RecycleView完成((⊙﹏⊙)程序员死磕病又犯了)。
1.首先item文件,因为需要,每个Item都是宽度与屏幕等长,要在代码中实现,不然图片宽度会不一样
item_photo_preview.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/photo_preview_img" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/face" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /></LinearLayout>
2.适配器
PhotoPreviewAdapter.java
package com.phc.act.myphcapp.adapter;import android.content.Context;import android.graphics.Point;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.LinearLayout;import com.phc.act.myphcapp.R;import com.phc.act.myphcapp.app.MyApp;import com.phc.act.myphcapp.viewholder.PhotoPreviewViewHolder;import java.util.ArrayList;/** * Created by Administrator on 2015/11/2. */public class PhotoPreviewAdapter extends RecyclerView.Adapter<PhotoPreviewViewHolder> { ArrayList<CharSequence> data; Context context; public PhotoPreviewAdapter() { data = new ArrayList<>(); } @Override public PhotoPreviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (context == null) context = parent.getContext(); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo_preview, parent, false); PhotoPreviewViewHolder viewHolder = new PhotoPreviewViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(PhotoPreviewViewHolder holder, int position) { Point p = new Point(); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getSize(p); //之所以高度是MATCH_PARENT 是因为图片会根据高度居中显示,否则会在屏幕上方 holder.img.setLayoutParams(new LinearLayout.LayoutParams(p.x, ViewGroup.LayoutParams.MATCH_PARENT)); MyApp.loadImage(data.get(position).toString(), holder.img, context); } public ArrayList<CharSequence> getData() { return data; } @Override public int getItemCount() { return data.size(); }}
3.ViewHolder
PhotoPreviewViewHolder.java
package com.phc.act.myphcapp.viewholder;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ImageView;import com.phc.act.myphcapp.R;/** * Created by Administrator on 2015/11/2. */public class PhotoPreviewViewHolder extends RecyclerView.ViewHolder { public ImageView img; public PhotoPreviewViewHolder(final View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.photo_preview_img); }}
4.主界面
重头戏来了,主要是实现两个接口
View.OnTouchListener, GestureDetector.OnGestureListener
前一个是获取用户触摸的Event,之后传递给GestureDetector对象,分析用户的手势
PhotoPreviewActivity.java
package com.phc.act.myphcapp.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.widget.RelativeLayout;import com.phc.act.myphcapp.R;import com.phc.act.myphcapp.adapter.PhotoPreviewAdapter;import com.phc.act.myphcapp.constant.Constant;public class PhotoPreviewActivity extends AppCompatActivity implements View.OnTouchListener, GestureDetector.OnGestureListener { RecyclerView recyclerView; PhotoPreviewAdapter adapter; int currentPosition = 0; GestureDetector detector; RelativeLayout relativeLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo_preview); relativeLayout = (RelativeLayout) findViewById(R.id.photo_preview_mainLayout); recyclerView = (RecyclerView) findViewById(R.id.photo_preview_recycleView); recyclerView.setOnTouchListener(this); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerView.setLayoutManager(layoutManager); adapter = new PhotoPreviewAdapter(); detector = new GestureDetector(this, this); recyclerView.setHasFixedSize(true); adapter.getData().addAll(getIntent().getCharSequenceArrayListExtra(Constant.PHOTOARRAYLIST)); recyclerView.setAdapter(adapter); recyclerView.setHorizontalScrollBarEnabled(false); adapter.notifyDataSetChanged(); recyclerView.smoothScrollToPosition(1); } @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("phc", "onFling"); if (e1.getX() - e2.getX() > 0 && currentPosition < recyclerView.getChildCount()) { currentPosition++; // 手向左滑动,图片下一张 } else if (e2.getX() - e1.getX() > 0 && currentPosition > 0) { // 向右滑动,图片上一张 currentPosition--; } recyclerView.smoothScrollToPosition(currentPosition); return false; } @Override public boolean onTouch(View v, MotionEvent event) { Log.i("phc", "onTouch"); //传递event给GestureDetector对象 detector.onTouchEvent(event); return true; }}
5.主视图
activity_photo_preview.xml
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.phc.act.myphcapp.activity.PhotoPreviewActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> </android.support.design.widget.AppBarLayout> <?xml version="1.0" encoding="utf-8"?><RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" android:id="@+id/photo_preview_mainLayout"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/photo_preview_recycleView" android:scrollbars="horizontal" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /></RelativeLayout></android.support.design.widget.CoordinatorLayout>
PS:因为是用android studio做的,所以自动生成的代码有点多,有错的地方请指正!
1 0
- 基于RecyclerView实现ViewPager的功能(横向)
- 基于ViewPager+Recyclerview实现的CalendarView视图
- Android ViewPager控件的使用(基于ViewPager的横向相册)
- Android ViewPager控件的使用(基于ViewPager的横向相册)!!!
- Android ViewPager控件的使用(基于ViewPager的横向相册)!!!
- Android ViewPager控件的使用(基于ViewPager的横向相册)!!!
- Android中横向滑动(TabLayout+ViewPager)的实现
- RecyclerView实现横向的GridView效果
- RecyclerView+CheckBox 实现横向的图片选择
- RecyclerView实现横向滚动
- RecyclerView实现横向滚动
- 横向居中的RecyclerView
- 使用ViewPager和RecyclerView实现水平分页功能
- 自定义RecyclerView实现垂直滑动的ViewPager
- 基于ViewPager实现大量图片浏览功能
- 基于ViewPager实现大量图片浏览功能
- 使用RecyclerView实现横向WheelView
- RecyclerView 实现横向滚动效果
- java播放mp3/ogg/ape/flac音乐
- Mac IDEA14 SVN 版本升级(easy_行者)
- 定时调度shell
- Source Code Tags and Builds
- Firefox 不支持 background-position-x 和 background-position-y
- 基于RecyclerView实现ViewPager的功能(横向)
- 轮番图
- android studio adbwifi 调试android程序 告别数据线
- React Native for Android 实战(一):配置和起步
- Java 集合
- Tomcat服务器随手笔记
- 开关控件Switch和ToggleButton
- Oracle创建DBlink和Sysnonyms(同义词,表映射)的方法及常见问题处理
- Android 高亮变色显示文本中的关键字