RecycleView适配器内的ViewPager

时间:2018-02-07 12:35:52

标签: java android android-recyclerview android-viewpager fragment

我尝试在 RecycleView 项目中添加 Viewpager ,然后我为循环视图创建了适配器,并创建了一个从 FragmentStatePagerAdapter扩展的Pager Adapter 类。

只是回收的第一项工作正常,但回收视图的其余项目不显示视图寻呼机。

当我登录寻呼机适配器时,我可以看到所有片段位置。

当我在任何回收视图项的任何寻呼机内水平滚动时,我可以看到Log语句,但屏幕上没有任何内容。

在这种情况下,有人可以帮助我吗? 这是我的代码

public class RentCategoryItemAdapter extends RecyclerView.Adapter<RentCategoryItemAdapter.ViewHolder> {

    Context mContext;
    ArrayList<RentCategoryItem> categoryItems;
    ArrayList<MyPagerAdapter> pagerAdapters = new ArrayList<>();
    /*ArrayList<ViewPager> pagerArrayList = new ArrayList<>();
    ArrayList<MyPagerAdapter> myPagerAdapterArrayList = new ArrayList<>();*/
    public RentCategoryItemAdapter(Context context, ArrayList<RentCategoryItem> categoryItems) {
        mContext = context;
        this.categoryItems = categoryItems;
        AppCompatActivity activity = (AppCompatActivity) mContext;
        for (int i = 0; i < categoryItems.size(); i++) {
            pagerAdapters.add(new MyPagerAdapter(activity.getSupportFragmentManager(), categoryItems.get(i).catItems));
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemLayoutView;

        itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rent_category_item,parent, false);

        RentCategoryItemAdapter.ViewHolder viewHolder = new RentCategoryItemAdapter.ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.catName.setText(categoryItems.get(position).catName);
        //AppCompatActivity activity = (AppCompatActivity) mContext;
        //holder.mPagerAdapter = new MyPagerAdapter(activity.getSupportFragmentManager(), categoryItems.get(position).catItems);
        holder.pager.setAdapter(pagerAdapters.get(position));
        Log.d("Tag", pagerAdapters.get(position).getCount() + " position " + position);
        /*holder.mPagerAdapter = myPagerAdapterArrayList.get(position);
        holder.pager.setAdapter(myPagerAdapterArrayList.get(position));*/
        int margin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10*16, mContext.getResources().getDisplayMetrics());
        holder.pager.setPageMargin(-margin);
    }



    @Override
    public int getItemCount() {
        return categoryItems.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        private PagerAdapter mPagerAdapter;
        TextView catName;
        ViewPager pager;
        public ViewHolder(View itemView) {
            super(itemView);
            pager = itemView.findViewById(R.id.pager);
            catName = itemView.findViewById(R.id.cat_name);
            /*pagerArrayList.add(new ViewPager(mContext));
            AppCompatActivity activity = (AppCompatActivity) mContext;
            myPagerAdapterArrayList.add(new MyPagerAdapter(activity.getSupportFragmentManager()));*/
        }
    }


    private class MyPagerAdapter extends FragmentStatePagerAdapter {
        ArrayList<RentItem> items;
        public MyPagerAdapter(FragmentManager fm, ArrayList<RentItem> items) {
            super(fm);
            this.items = items;
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new RentCategoryForPagerFragment();
            Bundle bundle = new Bundle();
            bundle.putString("first_last", "first");
            bundle.putString("product_id", items.get(position).productId);
            bundle.putString("product_name", items.get(position).productName);
            bundle.putString("product_price", items.get(position).productPrice);
            bundle.putString("product_image", items.get(position).productImage);
            fragment.setArguments(bundle);
            Log.d("Tag", "inside my pager adapter " + position);
            return fragment;
        }

        @Override
        public int getCount() {
            return items.size();
        }
    }
}

这里是RentCategoryForPagerFragment类

public class RentCategoryForPagerFragment extends Fragment {

    String firstOrLast = "";
    ImageView productImage;
    TextView productName, productPrice;
    String productId;
    Button showDetailsButton;
    public RentCategoryForPagerFragment() {
        //firstOrLast = getArguments().getString("first_last");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.rent_item_in_category_layout, container, false);
        productImage = rootView.findViewById(R.id.product_image);
        productName = rootView.findViewById(R.id.product_name);
        productPrice = rootView.findViewById(R.id.product_price);
        showDetailsButton = rootView.findViewById(R.id.show_details_button);
        Bundle bundle = getArguments();
        String imageURL = bundle.getString("product_image");
        Glide.with(getActivity()).load(imageURL).into(productImage);
        productId = bundle.getString("product_id");
        productName.setText(bundle.getString("product_name"));
        productPrice.setText(bundle.getString("product_price"));
        showDetailsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "Clicked ", Toast.LENGTH_LONG).show();
            }
        });
        return rootView;
    }
  }

我得到的结果 image

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案。我使用了错误的类,因为它听起来 FragmentStatePagerAdapter FragmentPagerAdapter 类不能满足我的想法。 因此,您应该从 PagerAdapter 扩展,以在同一屏幕中实现多个寻呼机。你应该覆盖一些方法来完成它。

我希望这个答案能在某一天帮助某人。