ListView嵌套ViewPager
2014-03-27 18:08
295 查看
关键:ListView的每一行包含一个ViewPager,即在Adapter的getView()方法中返回的是一个带ViewPager的布局。另外在自定义的ViewPager中需要自己根据滑动的位置和距离判断是由ViewPager自己处理滑动还是由父容器ListView来进行处理。示例如下:
MainActivity:
MyListAdapter:
MyViewPager:
ViewPager的布局内容:
fragment1.xml:
fragment2.xml:
fragment3.xml:
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>
相关文章推荐
- android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager
- ListView嵌套ViewPager事件冲突问题
- Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法
- 解决ScrollView嵌套viewPager中嵌套listView滑动事件冲突问题(水平方向)
- 笔记---listview嵌套viewpager问题
- Android listview嵌套viewpager滑动冲突问题
- ScrollView或者ListView中嵌套ViewPager,展示不出来问题。
- listview嵌套viewpager 滑动冲突问题
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- 关于viewpager 里嵌套 listview 同时实现翻页功能的“java.lang.IllegalStateException: The specified child..."异常处理
- 一个 ScrollView 里面包含 viewpager 嵌套 listview 或 RecyclerView 极少代码实现的流畅滑动效果 处理一个两层滑动 view 的自定义布局,以最少的代码实现,
- ListView中嵌套ViewPager(ViewPager是item的一部分),并且存在判断位置的小白点。
- 防止viewpager和子view滑动冲突(ScrollView嵌套webview,Listview嵌套Listview 滑动事件冲突)
- 仿淘宝、京东拖拽商品详情(可嵌套ViewPager、ListView、WebView、FragmentTabhost)
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- listview嵌套viewpager 滑动冲突问题
- listView中嵌套viewpager随着listview滚动
- Android ScrollView嵌套Viewpager嵌套ListView切换时到顶部或位置改变问题解决
- 滑动冲突(ScrollView嵌套ViewPager,ViewPager再嵌套ListView)
- 当ListView中嵌套ViewPager滑动冲突问题