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

时间:2015-01-13 17:42:53

标签: android android-viewpager

我在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 Implementaton

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

1 个答案:

答案 0 :(得分:3)

除了覆盖已弃用的方法之外,instantiateItem()应该实例化项目。这就是为什么单词“instantiate”在方法名称中。您没有实例化某个项目,而是尝试使用其他东西拥有的现有窗口小部件,这会破坏PagerAdapter合同,并且随着时间的推移不太可靠。

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

例如,以下活动的ViewPager基于View PagerAdapter

/***
  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()调用,但我还没有尝试过。