Viewpager中嵌套Listview,而且Listview的item中夹杂ViewPager

本文介绍了如何在Android应用中实现一个复杂布局:在一个ViewPager的多个页面中使用ListView,且ListView的每个item内还包含了一个ViewPager。通过示例代码展示从MainActivity到ChildView的配置过程,详细解释了如何搭建这个嵌套结构。
摘要由CSDN通过智能技术生成


//现在有一个需求,需要在一个ViewPager的几个页面用listview显示,而且listview的item种类>=2,其中还有viewpager那么盖怎么实现呢,废话不多说,先把ViewPager架子搭起来

效果


MainActivity.java

public class MainActivity extends Activity {

	private ViewPager viewpager;
	private List<View> list = new ArrayList<View>();
	private MyPageAdapter adapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		viewpager = (ViewPager)findViewById(R.id.viewpager);
		
		initData();
		adapter = new MyPageAdapter();
		viewpager.setAdapter(adapter);
	}
	//添加3个listview
	private void initData() {
		list.add(new View1(this).listview);
		list.add(new View1(this).listview);
		list.add(new View1(this).listview);
	}

	class MyPageAdapter extends PagerAdapter{

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

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0==arg1;
		}
		
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			((ViewGroup)container).addView((View)list.get(position));
			return list.get(position);
			
		}
		
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView(list.get(position));
		}
		
	}
 
}

activity_main.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zyh.listview_viewpager.MainActivity" >

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



现在ViewPager有了,再看一下要添加的listview


public class View1 {
	public static final int VIEWTYPE_VIEWPAGER = 0;
	public static final int VIEWTYPE_TEXTVIEW = 1;
	ListView listview;
	private Context mContext;
	private MyListviewAdapter adapter;

	public View1(Context context) {
		init(context);
	}

	public void init(Context context) {
		mContext = context;
		listview = new ListView(context);
		adapter = new MyListviewAdapter();
		listview.setAdapter(adapter);
	}

	class MyListviewAdapter extends BaseAdapter {

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

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			if (position % 3 == 0) {
				// viewpager

				if (convertView == null) {
					ChildView child = new ChildView();
					child.init(mContext);
					convertView = child.viewPager;
				}

			} else {
				// textview
				if (convertView == null) {
					convertView = new TextView(mContext);

				}
				((TextView)convertView).setText("测试数据:"+position);
			}
			System.out.println(convertView.toString());
			return convertView;
		}
		@Override
		public int getViewTypeCount() {
			return 2;
		}
		@Override
		public int getItemViewType(int position) {

			if (position % 3 == 0) {
				// viewpager

				return VIEWTYPE_VIEWPAGER;

			} else {
				// textview
				return VIEWTYPE_TEXTVIEW;
			}
		}

	}
}


然后是listview中的item为 ViewPager的情况


ChildVIew.java

public class ChildView {

	ViewPager viewPager;
	private List<View> list = new ArrayList<View>();
	private Context mContext;


	public void init(Context context) {
		mContext = context;

		for (int i = 0; i < 5; i++) {
			Button view = new Button(mContext);
			view.setText("ViewPager中的TextView:" + i);
			view.setTextSize(20);
			list.add(view);
		}
		viewPager = (ViewPager) View.inflate(mContext, R.layout.layout_viewpager, null);
		
		/**
		 * 必须设置LayoutParams
		 */
		
		AbsListView.LayoutParams lp = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, 200);
		viewPager.setLayoutParams(lp);
		viewPager.setAdapter(new MyPageAdapter());
	}

	class MyPageAdapter extends PagerAdapter {

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

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

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			container.addView(list.get(position));
			return list.get(position);

		}

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

	}

}

layout_viewpager.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_blue_bright" >

    <!-- 布局中设置宽高没有生效,必须代码设置layoutParams -->

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






  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ViewPager嵌套ListView时,可能会遇到ListView无法滑动的问题,这是因为ViewPager会拦截ListView的滑动事件。解决方法如下: 1. 自定义ListView,重写其onInterceptTouchEvent()方法,返回false,让ViewPager不拦截ListView的滑动事件。 ``` public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false); break; case MotionEvent.ACTION_UP: setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); } } ``` 2. 在ViewPager的适配器,将ListView所在的布局设置为android:descendantFocusability="blocksDescendants",防止ListView获取焦点而导致ViewPager无法滑动。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> <com.example.MyListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 以上两种方法都可以解决ViewPagerListView失效的问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值