ViewPager 嵌套 ListView实现简单动态滑动

来源:互联网 发布:网络红歌 编辑:程序博客网 时间:2024/06/05 16:47

本人初学者,第一次写博文,谢谢大家交流学习。

ViewPager 嵌套 ListView实现简单动态滑动



最近在编写一个简单的游戏物品栏,需要用到左右滑动切换页面,并且每页还要有gridview作存放物品的格子,出屏后需要上下滑动;

一下用listView简单说明

发现ViewPager 嵌套 ListView后超过两页就报错。主要代码如下:

public class MainActivity extends Activity {private List<View> views;private ViewPager vpGuide;private ListView listView;private int i = 0;private ListviewAdaper listviewadaper;private String[] strings;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initGuideViews();}private void initGuideViews() {vpGuide = (ViewPager) findViewById(R.id.vwpg);views = new ArrayList<View>();LayoutInflater inflater = LayoutInflater.from(MainActivity.this);/****************************/for (i = 0; i < 3; i++) {strings = new String[] { "苹果", "香蕉", "樱桃", "葡萄", "芒果", "梨", "橘子","苹果", "香蕉", "樱桃", "葡萄", "芒果", "梨", "橘子", "苹果", "香蕉", "樱桃","葡萄", "芒果", "梨", "橘子", "苹果", "香蕉", "樱桃", "葡萄", "芒果", "梨","橘子" };listView = (ListView) (inflater.inflate(R.layout.activity_listview,null)).findViewById(R.id.listView);listviewadaper = new ListviewAdaper(MainActivity.this,R.layout.listview_ltem, strings);listView.setAdapter(listviewadaper);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {Toast.makeText(MainActivity.this, strings[arg2],Toast.LENGTH_LONG).show();// TODO Auto-generated method stub}});views.add(listView);}/****************************/MainpagerAdapter mainpageradapter = new MainpagerAdapter(views);vpGuide.setAdapter(mainpageradapter);// TODO Auto-generated method stub}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}
其实本身以上代码是没有错误,错误指向:继承PagerAdapter适配器的类的加载页面的方法instantiateItem()

public Object instantiateItem(ViewGroup container, int position) {      container.addView(views.get(position), 0);                        return views.get(position);    }

平常写静态页面时都还好,为什么加入动态页面就只能滑动两页,第三页就报错。

事后查阅资料发现:加载页面时,事先系统会加载好前两个页面,第三页加载时,会继续调用此方法。

所以错误根源出现在这里,更改后为:

public Object instantiateItem(ViewGroup container, int position) {      try {                 if(views.get(position).getParent()==null)                    ((ViewPager) container).addView(views.get(position), 0);                  else{                    ((ViewGroup)views.get(position).getParent()).removeView(views.get(position));                    ((ViewPager) container).addView(views.get(position), 0);                 }            } catch (Exception e) {                  e.printStackTrace();              }        return views.get(position);    }

http://www.tuicool.com/articles/NZFFZz

参照此页代码。

更改后程序运行正常,主要是需要用GetParent返回包含这个窗口的窗口Handle





1 0