如何绑定RecyclerView和ViewPager才能正常工作?

时间:2017-05-01 19:59:05

标签: android android-recyclerview android-viewpager

我有一些显示使用RecyclerView的图像列表,如果点击任何图像,则打开新的图像窗口,在此窗口中可以滑动使用ViewPager。有可能实施吗?我开始但无法应付......

activity_main.xml中

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fadeScrollbars="false"
        android:scrollbars="vertical"
        tools:context=".MainActivity"/>
</RelativeLayout>

MainActivity

public class MainActivity extends AppCompatActivity {

    private Context mContext;
    private RecyclerView mRecyclerView;
    private ImageAdapter mImageAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = getApplicationContext();
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mImageAdapter = new ImageAdapter(mContext, Images.loadImages);
        mLayoutManager = new GridLayoutManager(this, 2);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mImageAdapter);
    }
}

activity_preview.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_gallery"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#313130"
    android:orientation="vertical"
    tools:context=".PreviewActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/preview_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

PreviewActivity

public class PreviewActivity extends FragmentActivity {

    private ViewPager viewPager;
    private PagerAdapter pagerAdapter;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preview);

        viewPager = (ViewPager) findViewById(R.id.preview_pager);
        pagerAdapter = new PreviewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);
    }
}

ImageAdapter

class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.Holder> {
    private int[] mItemList;
    private Context mContext;

    ImageAdapter(Context context, int[] itemList) {
        this.mContext = context;
        this.mItemList = itemList;
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_list, null);
        return new Holder(layoutView);
    }

    @Override
    public void onBindViewHolder(Holder holder, int position) {
        Picasso.with(mContext).load(Images.loadImages[position]).placeholder(R.drawable.ic_stub).resize(400, 750).into(holder.view);
    }

    @Override
    public int getItemCount() {
        return this.mItemList.length;
    }

    class Holder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageView view;

        Holder(View itemView) {
            super(itemView);
            mContext = itemView.getContext();
            view = new ImageView(mContext);
            view = (ImageView) itemView.findViewById(R.id.recycler_view);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            final Intent intent = new Intent(mContext, PreviewActivity.class);
            intent.putExtra("id_test", getAdapterPosition());
            mContext.startActivity(intent);
        }
    }
}

fragment_view_pager.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/result_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:cropToPadding="true" />
</RelativeLayout>

PageFragment - 这里我不知道如何正确制作

public class PageFragment extends Fragment {

    private static final String ARGUMENT_PAGE_NUMBER = "id_test";
    private int pageNumber;
    private Uri source;

    static PageFragment newInstance(int page) {
        PageFragment pageFragment = new PageFragment();
        Bundle arguments = new Bundle();
        arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
        pageFragment.setArguments(arguments);
        return pageFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent i = getActivity().getIntent();
        pageNumber = i.getExtras().getInt("id_test");
        source = Uri.parse("android.resource://com.test.nico/drawable/" + Images.loadImages[pageNumber]);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_view_pager, null);

        ImageView resultView = (ImageView) view.findViewById(R.id.result_image);
//        resultView.setImageURI(source);
        pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
        resultView.setImageResource(pageNumber);
        return view;
    }
}

PreviewPagerAdapter

class PreviewPagerAdapter extends FragmentStatePagerAdapter {

    private int imagesCount = Images.loadImages.length;
    private int[] images = Images.loadImages;

    PreviewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return imagesCount;
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.newInstance(images[position]);
    }
}

view_list.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBlack"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="168dp"
        android:layout_margin="1dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_stub"/>

</LinearLayout>

仅举例来说图片

class Images {
    final static int[] loadImages = new int[]{
            R.drawable.img_01,
            R.drawable.img_02,
            R.drawable.img_03,
            R.drawable.img_04// etc.
    };
}

请帮助我理解。 问题 - 无法实现:如果在MainActivity中点击图像 - 此图像必须在PreviewActivity全屏幕中打开,我可以左右滚动使用ViewPager浏览阵列中的下一个或上一个图像。 现在,当我点击图像,如果在 PageFragment resultView.setImageResource(pageNumber);中使用 - 然后总是在我的数组中打开firts图像,如果使用resultView.setImageURI(source); - 然后打开真实图像,但如果滑动 - 始终显示此图像。 Sory为我的英文=)

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。在我的PreviewActivity我必须将我的图片位置添加到viewPager使用方法setCurrentItem

viewpager.setCurrentItem(getIntent().getExtras().getInt("id_test"));