安卓ViewPager和ListViews

12

我对Android开发和整个开发过程相对不熟悉。我在ViewPager的语法/流程方面遇到了一些问题。

我有几个ListView想要实现到ViewPager中。我已经加载了兼容包,但我还没有看到任何完整的示例来进行操作。

我通过查看示例来学习最有效。如果有人能够发布任何已经实现这种功能的项目示例,请告诉我。

问题是我在启动活动时在这一行上得到了一个空指针异常:

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

我怀疑我做错了什么。如果我不使用ViewPager,我可以让两个列表都显示它们的内容。所以我知道这些列表不是空的...

编辑:

感谢VenomM提供下面的答案!这是我最终使用的代码,稍作修改基于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 ) {}
}

ArrayAdapter:

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

}

https://androidbeasts.wordpress.com/2015/08/11/tabs-with-swipe-views/#more-79 - Aakash
3个回答

5
我仍然不明白为什么您要使用带有对象参数的ArrayAdapter,如果您想它保存字符串项。 请尝试更改。
new ArrayAdapter<Object>(this, R.layout.rowlayout, list1)

to

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

我使用了自定义的ArrayAdapter,一切都很顺利。如果你成功了,请让我知道。


2
谢谢,我稍后会尝试。但我仍然认为我的问题在于ViewPagerAdapter。我找到了这个例子:http://blog.stylingandroid.com/archives/542;但他只展示了如何从相同的数据中在代码中创建ListView。我想要能够从不同的数组中创建不同的页面。 - explosivo
好的,这里是我使用相同示例(分页适配器部分)进行尝试的结果。不确定这是否是最佳方法。希望这能解决你的问题 :) 此外,这个是我使用的自定义适配器。 - VenoM

3
这里有一个例子:
MainActivity:
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"}));

    }
}

CustomViewPagerAdapter.java

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

}

欲了解更多信息,请查看我的博客。这里


好的例子,但是你的适配器中的上下文并没有被使用。 - Luis Lavieri

0
你使用的是哪个ViewPager?V4兼容jar包吗?
如果是的话,请仔细检查事件。特别是onCreate、onCreateView和onActivityCreated之间的区别。

是的,我正在使用兼容性jar包中的ViewPager。我知道如何在我的项目中让它工作。但我不明白的是如何使用来自strings.xml的字符串数组来显示自定义列表视图。 - explosivo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接