如何绑定RecyclerView和ViewPager以正确工作?(How to bind RecyclerView and ViewPager to work correctly?)

编程入门 行业动态 更新时间:2024-10-27 15:25:32
如何绑定RecyclerView和ViewPager以正确工作?(How to bind RecyclerView and ViewPager to work correctly?)

我有一些显示使用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>

主要活动

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 for my english =)

I have some list of images that displaying use RecyclerView and if tap to any image, then open new window of image and in this window can swipe use ViewPager. Is it possible to implement? I started but can not cope...

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 - here I don't know how to make correctly

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]); } }

also 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>

and just for example Images

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. }; }

Help me to understand please. Issue - can not implement so: if tap to image in MainActivity - this image has to open in PreviewActivity full screen and there I can make scroll right and left use ViewPager to browse the next or previous image in the array. Now, when i tap to image, and if use in PageFragment resultView.setImageResource(pageNumber); - then always open firts image in my array, and if use resultView.setImageURI(source); - then open true image but if swipe - always show this one image. Sory for my english =)

最满意答案

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

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

I found solution. In my PreviewActivity i have to add my image position to viewPager use method setCurrentItem:

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

更多推荐

本文发布于:2023-07-30 11:54:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1337893.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   正确   工作   RecyclerView   correctly

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!