基于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
原创粉丝点击