Android ViewPager和ListView

Android ViewPager和ListView,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我对安卓系统的开发和总体开发还比较陌生。我无法掌握ViewPager的语法/过程 我有几个列表视图,我想实现到一个ViewPager中。我已经加载了兼容包和所有东西。但我还没有看到任何完整的例子来说明如何做到这一点 我通过看例子学习得最好。如果有人能发布你在其中实施过此类事情的任何项目的示例,请让我知道 问题是,在尝试启动活动时,此行出现空指针异常: listView1.setAdapter(new ArrayAdapter<Object>(this, R.layout.rowlay

我对安卓系统的开发和总体开发还比较陌生。我无法掌握ViewPager的语法/过程

我有几个列表视图,我想实现到一个ViewPager中。我已经加载了兼容包和所有东西。但我还没有看到任何完整的例子来说明如何做到这一点

我通过看例子学习得最好。如果有人能发布你在其中实施过此类事情的任何项目的示例,请让我知道

问题是,在尝试启动活动时,此行出现空指针异常:

listView1.setAdapter(new ArrayAdapter<Object>(this, R.layout.rowlayout, list1));
listView1.setAdapter(新的ArrayAdapter(this,R.layout.rowlayout,list1));
我怀疑我只是做错了。如果我不使用ViewPager,我可以让两个列表显示它们的内容。所以我知道列表不是空的

编辑:

感谢Venom给出下面的答案!下面是我最终使用的代码,它是根据VenomM的示例稍微修改的

ViewPagerAdapter:

public class ViewPagerAdapter extends PagerAdapter implements TitleProvider
{
    private ListView listView1;
    private static String[] titles = new String[]
    {
       "Page 1",
       "Page 2",
       "Page 3",
    };
    private final Context context;

    public ViewPagerAdapter( Context context )
    {
        this.context = context;
    }

    @Override
    public String getTitle( int position )
    {
        return titles[ position ];
    }

    @Override
    public int getCount()
    {
        return titles.length;
    }

    @Override
    public Object instantiateItem(View collection, int position) {

        LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater();

        listView1 = (ListView) layoutInflater.inflate(R.layout.listview1, null);

        String[] listData = null;
        MyArrayAdapter dataAdapter;

        if (position == 0) {
          listData = context.getResources().getStringArray(R.array.list1);
          dataAdapter = new MyArrayAdapter((Activity) context,
              R.layout.rowlayout, listData);
        } else if (position == 1) {
          listData = context.getResources().getStringArray(R.array.list2);
          dataAdapter = new MyArrayAdapter((Activity) context,
              R.layout.rowlayout, listData);
        } else {
          listData = context.getResources().getStringArray(R.array.list3);
          dataAdapter = new MyArrayAdapter((Activity) context,
              R.layout.rowlayout, listData);
        }

        listView1.setAdapter(dataAdapter);
        listView1.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                int position, long arg3) {
              Toast.makeText(context,
                  adapter.getAdapter().getItem(position).toString(),
                  Toast.LENGTH_LONG).show();
            }
        });

        ((ViewPager) collection).addView(listView1, 0);

        return listView1;
    }


    @Override
    public void destroyItem(View collection, int position, Object view) {
        System.out.println("on destroyItem()");
        ((ViewPager) collection).removeView((ListView) view);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        System.out.println("on isViewFromObject()");
        return view == ((ListView) object);
    }

    @Override
    public void finishUpdate( View view ) {}

    @Override
    public void restoreState( Parcelable p, ClassLoader c ) {}

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void startUpdate( View view ) {}
}
public类ViewPagerAdapter扩展PagerAdapter实现TitleProvider
{
私有列表视图列表视图1;
私有静态字符串[]标题=新字符串[]
{
“第1页”,
“第2页”,
“第3页”,
};
私人最终语境;
public ViewPagerAdapter(上下文)
{
this.context=上下文;
}
@凌驾
公共字符串getTitle(int位置)
{
返回标题[职位];
}
@凌驾
public int getCount()
{
返回标题。长度;
}
@凌驾
公共对象实例化项(视图集合,int位置){
LayoutInflater LayoutInflater=((活动)上下文)。getLayoutInflater();
listView1=(ListView)LayoutFlater.inflate(R.layout.listView1,null);
字符串[]listData=null;
MyArrayAdapter数据适配器;
如果(位置==0){
listData=context.getResources().getStringArray(R.array.list1);
dataAdapter=新的MyArrayAdapter((活动)上下文,
R.layout.rowlayout,listData);
}否则如果(位置==1){
listData=context.getResources().getStringArray(R.array.list2);
dataAdapter=新的MyArrayAdapter((活动)上下文,
R.layout.rowlayout,listData);
}否则{
listData=context.getResources().getStringArray(R.array.list3);
dataAdapter=新的MyArrayAdapter((活动)上下文,
R.layout.rowlayout,listData);
}
listView1.setAdapter(dataAdapter);
listView1.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图适配器、视图、,
整数位置,长arg3){
Toast.makeText(上下文,
adapter.getAdapter().getItem(位置).toString(),
Toast.LENGTH_LONG).show();
}
});
((ViewPager)集合).addView(listView1,0);
返回列表视图1;
}
@凌驾
公共项(视图集合、int位置、对象视图){
System.out.println(“on destroyItem()”;
((ViewPager)集合)。移除视图((ListView)视图);
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
System.out.println(“在isViewFromObject()上”);
返回视图==((ListView)对象);
}
@凌驾
public void finishUpdate(视图){}
@凌驾
公共地产(地块p,类装载器c){}
@凌驾
公共包裹存储状态(){
返回null;
}
@凌驾
公共无效启动日期(视图){}
}
阵列适配器:

public class MyArrayAdapter extends ArrayAdapter<String>{

    private Activity context = null;
    private String[] names = null;
    private int rowLayoutId;
    public MyArrayAdapter(Activity context, int textViewResourceId, String[] names) {
        super(context, textViewResourceId, names);
        this.context = context;
        this.names = names;
        this.rowLayoutId =textViewResourceId;
    }

    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    static class ViewHolder {
        protected ImageView imageView;
        protected TextView textView;
    }

}
公共类MyArrayAdapter扩展了ArrayAdapter{
私有活动上下文=null;
私有字符串[]名称=null;
私有内部布局;
公共MyArrayAdapter(活动上下文,int textViewResourceId,字符串[]名称){
super(上下文、textViewResourceId、名称);
this.context=上下文;
this.names=名称;
this.rowLayoutId=textViewResourceId;
}
//static保存对外部类的引用并避免访问
//包含类的任何成员
静态类视窗夹{
受保护的图像视图;
受保护的文本视图文本视图;
}
}

您使用的是哪种ViewPager?V4兼容性jar


如果是,请仔细检查事件。特别是onCreate、onCreateView和onActivityCreated之间的区别。

我仍然不明白为什么要用object参数更改Arrayadapter,如果要它保存字符串项。 试着改变

new ArrayAdapter<Object>(this, R.layout.rowlayout, list1)
new ArrayAdapter(this,R.layout.rowlayout,list1)

new ArrayAdapter(this,R.layout.rowlayout,list1)
我用了一个定制的ArrayAdapter,一切都很好。如果您成功了,请告诉我。

以下是一个示例:

主要活动:

public class MainActivity extends Activity {

    /** Called when the activity is first created. */

 private Context mContext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.main);
        ListView listview1 = new ListView(mContext);
        ListView listview2 = new ListView(mContext);
        ListView listview3 = new ListView(mContext);

        Vector<View> pages = new Vector<View>();

        pages.add(listview1);
        pages.add(listview2);
        pages.add(listview3);

        ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
        CustomPagerAdapter adapter = new CustomPagerAdapter(mContext,pages);
        vp.setAdapter(adapter);

        listview1.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A1","B1","C1","D1"}));
        listview2.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A2","B2","C2","D2"}));
        listview3.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A3","B3","C3","D3"}));

    }
}
公共类MainActivity扩展活动{
/**在首次创建活动时调用*/
私有上下文;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mContext=这个;
setContentView(R.layout.main);
ListView listview1=新的ListView(mContext);
ListView listview2=新的ListView(mContext);
ListView listview3=新的ListView(mContext);
向量页=新向量();
pages.add(列表视图1);
pages.add(列表视图2);
pages.add(listview3);
ViewPager vp=(ViewPager)findViewById(R.id.ViewPager);
CustomPagerAdapter适配器=新的CustomPagerAdapter(mContext,页面);
vp.setAdapter(适配器);
setAdapter(新的ArrayAdapter(mContext,android.R.layout.simple_list_item_1,新字符串[]{“A1”、“B1”、“C1”、“D1”);
listview2.setAdapter(新的ArrayAdapter(mContext,android.R.layout.simple_list_item_1,新字符串[]{“A2”,“B2”,“C
public class MainActivity extends Activity {

    /** Called when the activity is first created. */

 private Context mContext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.main);
        ListView listview1 = new ListView(mContext);
        ListView listview2 = new ListView(mContext);
        ListView listview3 = new ListView(mContext);

        Vector<View> pages = new Vector<View>();

        pages.add(listview1);
        pages.add(listview2);
        pages.add(listview3);

        ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
        CustomPagerAdapter adapter = new CustomPagerAdapter(mContext,pages);
        vp.setAdapter(adapter);

        listview1.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A1","B1","C1","D1"}));
        listview2.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A2","B2","C2","D2"}));
        listview3.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A3","B3","C3","D3"}));

    }
}
public class CustomPagerAdapter extends PagerAdapter {

 private Context mContext;
 private Vector<View> pages;

 public CustomPagerAdapter(Context context, Vector<View> pages) {
  this.mContext=context;
  this.pages=pages;
 }

 @Override
 public Object instantiateItem(ViewGroup container, int position) {
  View page = pages.get(position);
  container.addView(page);
  return page;
 }

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

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

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

}