【问题标题】:Android : Single Fragment Swipe on ViewPager to load next or previous recordAndroid:在 ViewPager 上单次滑动以加载下一条或上一条记录
【发布时间】:2016-12-04 10:15:42
【问题描述】:

我有一个包含产品详细信息的 ListView。在列表视图的项目单击上,我打开具有特定产品详细信息的新活动。我想将活动转换为 ViewPager,以便我可以滑动以在同一片段中加载下一条和上一条记录。所有记录的片段结构都相同。我不知道我应该从哪里开始。你能给我概述一下如何实现这一点。这是我的模型类。

Product.java

public class Product implements Serializable{

    public int id;
    public String Name;
    public String description;
    public String longDescription;
    public String amount;
    public String image;
}

这是我的 FragmentPagerAdapter 类

ProductPagerAdapter.java

public class ProductPagerAdapter extends FragmentPagerAdapter {

    private Context context;
    private ArrayList<Product> list;

    public ProductPagerAdapter(FragmentManager fm, Context context, ArrayList<Product> list) {
        super(fm);
        this.context = context;
        this.list = list;
    }

    @Override
    public Fragment getItem(int position) {
        return ProductFragment.newInstance(position);
    }

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

这是我的片段

ProductFragment.java

public class ProductFragment extends Fragment {

    public ProductFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View v = inflater.inflate(R.layout.fragment_product, container, false);

        //findViewById...

        return v;
    }

    public static Fragment newInstance(int id) {
        Bundle args = new Bundle();
        args.putInt("Id", id);
        ProductFragment fragment = new ProductFragment();
        fragment.setArguments(args);
        return fragment;
    }
}

现在在列表项上单击我正在打开新活动。我正在向它发送 Product 对象。

lv_itemRateList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(getActivity(), DetailsActivity.class);
                Product r = new Product();
                r = rateListArrayList.get(i);
                intent.putExtra("product",r);
                startActivity(intent);
            }
        });

我的 DetailsActivity 包含我的 viewpager。现在有人可以告诉我该怎么做吗?

【问题讨论】:

    标签: android listview android-fragments android-viewpager


    【解决方案1】:

    1-) 需要一个自定义的 ViewPager 适配器。

    我假设所有页面都具有相同的内容,因此它们都具有相同的布局,因此 ProductPagerAdapter 扩展了 PagerAdapter

    public class ProductPagerAdapter extends PagerAdapter
    {
         //variables
         private Context context;
         private ArrayList<Product> list;
         private Product product
    
         //views
        TextView  txtName ;
    
        public ProductPagerAdapter(Context context, List<Product> list) 
        {
            this.context = context;
            this.list = list;
        }
    
        @Override
        public int getCount()
        {
            return  list.size();
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object)
        {
            return view == ( object);
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) 
        {
            product = list.get(position);
    
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.fragment_product, container,false);
    
            txtName = (TextView) itemView.findViewById(R.id.txtName);
            txtName.setText(product.Name)
    
            ((ViewPager) container).addView(itemView);
    
            return itemView;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) 
        {
            ((ViewPager) container).removeView((LinearLayout) object); 
        }
    }
    

    2-) 适配器已准备就绪。现在让我们准备将显示详细信息的活动。首先初始化 ViewPager 和 ProductPagerAdapter。然后显示通过单击上一个活动选择的项目的详细信息。

    public class DetailsActivity extends Activity
    {
            @Override
            protected void onCreate(Bundle savedInstanceState)
            {
                ...
    
                //getting product object
                Intent intent = getIntent();
                Product product = (Product) getIntent().getSerializableExtra("product");
    
                //get selected item id
                int selectedItemID = 0;
                for(int i = 0 ; i < list.size() ; i++) 
                {
                   if(list.get(i).id == product.id)
                   {
                    selectedItemID = i;
                    break;
                   }
                }
    
                //Init ViewPager and adapter
                ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    
                ProductPagerAdapter detailAdapter = new ProductPagerAdapter(DetailActivity.this, list);
    
                // Binds the Adapter to the ViewPager
                viewPager.setAdapter(detailAdapter);
                viewPager.setCurrentItem(selectedItemID); // set selection
                viewPager.setPageTransformer(true, new ForegroundToBackgroundTransformer()); //custom transformer
    
                ...
            }
    }
    

    3-) 到目前为止,我们已经完成了我们必须做的事情。所以它会像这样工作。但我想指出的是,有几件事可以让 ViewPager 变得更好。

    性能:使用Parcelable 而不是Serializable。 Parcelable 需要更多时间来实现,但它的执行速度会快 10 倍并且使用更少的资源。请检查此 SO answer

    动画:您可能需要动画来转换 ViewPager。我建议你使用ViewPagerTransforms

    Indicators:如果你想使用分页指示器,我推荐ViewPagerIndicator

    更多关于ViewPager

    【讨论】:

    • 如何获取活动列表的参考。我收到编译时错误。
    • 它只是一个数组列表,其中有像 List list = new ArrayList(); 之类的 Product 对象。
    • 如果我写List&lt;Product&gt; list = new ArrayList();,那么列表将为空。如何获得与之前的活动列表相同的数据。
    • 首先,使用 GSON 将此列表转换为 JSON 字符串。然后在 ListView 的点击中添加转换后的字符串作为额外的意图。在 DetailsActivity 中,从 Intent 中获取该字符串并使用 GSON 将其转换为列表。
    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多