我正在为 ViewPager 使用折旧代码。想更新但是只能找到片段教程

I am using depreciated code for ViewPager. I want to update it but can only find fragment tutorials

我在 ViewPager 中使用布局,因为我不需要片段。如何实现带有布局的 ViewPager?我正在使用 pagerslidingtabstrip 库,但我认为这不是问题。如果您需要更多代码或问题,我可以更新我的问题。我删除了大部分布局以使其简单。

这是我的旧代码。

 instantiateItem() is depreciated.  

适配器

class HomePagerAdapter extends PagerAdapter {

    @Override
    public CharSequence getPageTitle(int position) {
        int resId = 0;
        switch (position) {
            case 0:
                resId = R.id.home_layout;
                return "Projects";
            case 1:
                resId = R.id.home_projects;
                return "Schedule";
        }
        return getPageTitle(position);
    }

    /*
     Depreciated, need to find out what is going to be replacing the depreciated statement
    */
    public Object instantiateItem(View collection, int position) {

        int resId = 0;
        switch (position) {
            case 0:
                resId = R.id.home_layout;
                break;
            case 1:
                resId = R.id.home_projects;
                break;
        }
        return findViewById(resId);
    }

    @Override

    public int getCount() {
        return 2;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == (arg1);
    }
}

ViewPager 实现

ViewPager pager;
HomePagerAdapter pgAdapter;
PagerSlidingTabStrip homePTS;

private void viewPager() {
    pager = (ViewPager) findViewById(R.id.pager);
    pgAdapter = new HomePagerAdapter();
    pager.setAdapter(pgAdapter);
    homePTS = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    homePTS.setViewPager(pager);
}

布局

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/home_layout">

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/home_projects">

    </RelativeLayout>

</android.support.v4.view.ViewPager>

已更新

    // Changed View to ViewGroup.  It Worked but not sure if it the proper way to do it?
    public Object instantiateItem(ViewGoup collection, int position) {

        int resId = 0;
        switch (position) {
            case 0:
                resId = R.id.home_layout;
                break;
            case 1:
                resId = R.id.home_projects;
                break;
        }
        return findViewById(resId);
    }

除了覆盖已弃用的方法之外,instantiateItem() 还应该实例化 一个项目。这就是 "instantiate" 这个词出现在方法名称中的原因。您不是在实例化一个项目,而是在尝试使用其他东西拥有的现有小部件,这违反了 PagerAdapter 合同并且随着时间的推移不太可能可靠。

因此,您的 instantiateItem() 方法应该使用 LayoutInflater(通过 Activity 上的 getLayoutInflater())到 inflate() 布局,或者构建适当的布局UI 用于 Java 代码中的页面。它需要将新 UI 作为 ViewGroup 的子 View 添加到 instantiateItem() 的非弃用版本中。

例如,这里有一个 activity 有一个 ViewPager 和一个基于 ViewPagerAdapter:

/***
  Copyright (c) 2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
 */

package com.commonsware.android.mvp1;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
  private ViewPager pager=null;

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

    pager=(ViewPager)findViewById(R.id.pager);
    pager.setAdapter(new SampleAdapter());
    pager.setOffscreenPageLimit(6);
  }

  /*
   * Inspired by
   * https://gist.github.com/8cbe094bb7a783e37ad1
   */
  private class SampleAdapter extends PagerAdapter {
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      View page=
          getLayoutInflater().inflate(R.layout.page, container, false);
      TextView tv=(TextView)page.findViewById(R.id.text);
      int blue=position * 25;

      final String msg=
          String.format(getString(R.string.item), position + 1);

      tv.setText(msg);
      tv.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG)
               .show();
        }
      });

      page.setBackgroundColor(Color.argb(255, 0, 0, blue));
      container.addView(page);

      return(page);
    }

    @Override
    public void destroyItem(ViewGroup container, int position,
                            Object object) {
      container.removeView((View)object);
    }

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

    @Override
    public float getPageWidth(int position) {
      return(0.5f);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
      return(view == object);
    }
  }
}

(来自 this sample project

instantiateItem(ViewGroup, int)中,我膨胀一个布局,自定义内容,然后手动将View添加到container。事实上,我可能可以将 true 作为第三个参数传递给 inflate() 方法并跳过额外的 addView() 调用,尽管我还没有尝试过。