关键:ListView的每一行包含一个ViewPager,即在Adapter的getView()方法中返回的是一个带ViewPager的布局。另外在自定义的ViewPager中需要自己根据滑动的位置和距离判断是由ViewPager自己处理滑动还是由父容器ListView来进行处理。示例如下:
MainActivity:
package com.home; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends Activity { private ListView listView; private List<String> list = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); listView = new ListView(this); listView.setDividerHeight(1); listView.setAdapter(new MyListAdapter(this, list)); setContentView(listView); } private void initData() { list.add("张三"); list.add("李四"); list.add("王五"); list.add("赵六"); list.add("杨七"); list.add("蒋八"); } }
MyListAdapter:
package com.home; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.TextView; import android.widget.RelativeLayout.LayoutParams; public class MyListAdapter extends BaseAdapter implements OnPageChangeListener { private Context context; private List<String> list; private LayoutInflater inflater; // 将要添加到Viewpager中的3个View private View view1; private View view2; private View view3; private List<View> views; public MyListAdapter(Context context, List<String> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } // 当列表数据发生变化时,用此方法来更新列表 public void updateListView(ArrayList<String> list) { this.list = list; notifyDataSetChanged(); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup arg2) { MyViewPager mvp = new MyViewPager(context); AbsListView.LayoutParams lp = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, 70); mvp.setLayoutParams(lp); views = new ArrayList<View>(); view1 = inflater.inflate(R.layout.fragment1, null); view2 = inflater.inflate(R.layout.fragment2, null); view3 = inflater.inflate(R.layout.fragment3, null); views.add(view1); views.add(view2); views.add(view3); TextView nameTV = (TextView) view2.findViewById(R.id.name); nameTV.setText(list.get(position)); mvp.setAdapter(new MyPageAdapter()); mvp.setOnPageChangeListener(this); mvp.setCurrentItem(1); return mvp; } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { if (position == 0) { } else if (position == 1) { } else if (position == 2) { } } class MyPageAdapter extends PagerAdapter { @Override public int getCount() { return views.size(); } @Override public Object instantiateItem(View container, int position) { ViewGroup group = (ViewGroup) views.get(position).getParent(); if (group != null) { group.removeView(views.get(position)); } ((ViewPager) container).addView(views.get(position)); return views.get(position); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(views.get(position)); } } }
MyViewPager:
package com.home; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; public class MyViewPager extends ViewPager { private float xDown;// 记录手指按下时的横坐标。 private float xMove;// 记录手指移动时的横坐标。 private float yDown;// 记录手指按下时的纵坐标。 private float yMove;// 记录手指移动时的纵坐标。 private boolean viewpagersroll = false;// 当前是否是viewpager滑动 public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // 记录按下时的位置 xDown = ev.getRawX(); yDown = ev.getRawY(); } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { xMove = ev.getRawX(); yMove = ev.getRawY(); if (viewpagersroll) { // viewpager自己处理滑动效果 getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); } // 这里的动作判断是Viewpager滑动,ListView不滑动 if (Math.abs(yMove - yDown) < 5 && Math.abs(xMove - xDown) > 20) { viewpagersroll = true; } else { // 由父容器listview来处理滑动效果 return false; } } else if (ev.getAction() == MotionEvent.ACTION_UP) { viewpagersroll = false; } return super.dispatchTouchEvent(ev); } }
ViewPager的布局内容:
fragment1.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:padding="5dp" android:text="通话" android:textSize="20sp" /> </LinearLayout>
fragment2.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="20sp" android:gravity="center" android:padding="5dp"/> </LinearLayout>
fragment3.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:padding="5dp" android:text="短信" android:textSize="20sp"/> </LinearLayout>
ListView嵌套ViewPager,布布扣,bubuko.com
原文:http://blog.csdn.net/u010142437/article/details/22307287