随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
关键: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>