ListView 头部ViewPager广告轮询图效果

来源:互联网 发布:禁止系统安装软件 编辑:程序博客网 时间:2024/05/16 14:53

我的listview头部加banner不是这样做得,在项目中遇到滑动banner图时不流畅,会出现卡顿,思考了下可能是冲突问题,这篇文章给了点思路,已解决。


之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下。

1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.testa;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.MotionEvent;  
  6. import android.widget.ListView;  
  7.   
  8. public class DefinedListView extends ListView {  
  9.   
  10.     public DefinedListView(Context context) {  
  11.         super(context);  
  12.     }  
  13.   
  14.     public DefinedListView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.     }  
  17.   
  18.     public DefinedListView(Context context, AttributeSet attrs, int defStyle) {  
  19.         super(context, attrs, defStyle);  
  20.     }  
  21.   
  22.     private float xDistance, yDistance, xLast, yLast;  
  23.   
  24.     @Override  
  25.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  26.         switch (ev.getAction()) {  
  27.             case MotionEvent.ACTION_DOWN:  
  28.                 xDistance = yDistance = 0f;  
  29.                 xLast = ev.getX();  
  30.                 yLast = ev.getY();  
  31.                 break;  
  32.             case MotionEvent.ACTION_MOVE:  
  33.                 final float curX = ev.getX();  
  34.                 final float curY = ev.getY();  
  35.                 xDistance += Math.abs(curX - xLast);  
  36.                 yDistance += Math.abs(curY - yLast);  
  37.                 xLast = curX;  
  38.                 yLast = curY;  
  39.                 if (xDistance > yDistance) {  
  40.                     return false;  
  41.                 }  
  42.         }  
  43.         return super.onInterceptTouchEvent(ev);  
  44.     }  
  45. }  

2、为了让广告轮询的速度减慢,必须重新设置ViewPager的Scroller,自定义的Scroller如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.testa;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. import android.annotation.SuppressLint;  
  6. import android.content.Context;  
  7. import android.os.Handler;  
  8. import android.support.v4.app.FragmentActivity;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.view.LayoutInflater;  
  11. import android.view.MotionEvent;  
  12. import android.view.View;  
  13. import android.view.View.OnTouchListener;  
  14. import android.view.animation.Interpolator;  
  15. import android.widget.Scroller;  
  16.   
  17. public class DefinedScroller extends Scroller {  
  18.   
  19.     private int DURATION_TIME = 1000;  
  20.   
  21.     private boolean shouldAutoScroll = true;  
  22.     private ViewPager viewPager = null;  
  23.   
  24.     @SuppressLint("HandlerLeak")  
  25.     private final Handler handler = new Handler() {  
  26.         public void handleMessage(android.os.Message msg) {  
  27.             if (shouldAutoScroll) {  
  28.                 viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);  
  29.                 handler.sendEmptyMessageDelayed(02000);  
  30.             }  
  31.         };  
  32.     };  
  33.   
  34.     public DefinedScroller(Context context) {  
  35.         super(context);  
  36.     }  
  37.   
  38.     public DefinedScroller(Context context, Interpolator interpolator) {  
  39.         super(context, interpolator);  
  40.     }  
  41.   
  42.     private View initViewPager(Context context) {  
  43.         View view = LayoutInflater.from(context).inflate(R.layout.view_pager_layout, null);  
  44.         this.viewPager = (ViewPager) view.findViewById(R.id.viewpager);  
  45.         this.viewPager.setOffscreenPageLimit(2);  
  46.         this.viewPager.setAdapter(new MyFragmentPagerAdapter(((FragmentActivity) context).getSupportFragmentManager()));  
  47.         return view;  
  48.     }  
  49.   
  50.     public ViewPager getViewPager() {  
  51.         return viewPager;  
  52.     }  
  53.   
  54.     public View initView(Context context) {  
  55.         View view = initViewPager(context);  
  56.         this.viewPager.setOnTouchListener(new OnTouchListener() {  
  57.   
  58.             @Override  
  59.             public boolean onTouch(View v, MotionEvent event) {  
  60.                 if (event.getAction() == MotionEvent.ACTION_UP) {  
  61.                     shouldAutoScroll = true;  
  62.                     handler.sendEmptyMessageDelayed(02000);  
  63.                 } else {  
  64.                     handler.removeMessages(0);  
  65.                     shouldAutoScroll = false;  
  66.                 }  
  67.                 return false;  
  68.             }  
  69.         });  
  70.         try {  
  71.             Field mScroller = ViewPager.class.getDeclaredField("mScroller");  
  72.             mScroller.setAccessible(true);  
  73.             mScroller.set(viewPager, this);  
  74.         } catch (NoSuchFieldException e) {  
  75.   
  76.         } catch (IllegalArgumentException e) {  
  77.   
  78.         } catch (IllegalAccessException e) {  
  79.   
  80.         }  
  81.         handler.sendEmptyMessageDelayed(02000);  
  82.         return view;  
  83.     }  
  84.   
  85.     public void setShouldAutoScroll() {  
  86.         handler.removeMessages(0);  
  87.         if (viewPager.isShown()) {  
  88.             shouldAutoScroll = true;  
  89.             handler.sendEmptyMessageDelayed(02000);  
  90.         } else {  
  91.             shouldAutoScroll = false;  
  92.         }  
  93.     }  
  94.   
  95.     @Override  
  96.     public void startScroll(int startX, int startY, int dx, int dy, int duration) {  
  97.         super.startScroll(startX, startY, dx, dy, shouldAutoScroll ? DURATION_TIME : duration);  
  98.     }  
  99.   
  100. }  

关键是startScroll方法啦

3、其他测试类,

(1)TestFragment:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.testa;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.ImageView;  
  9.   
  10. public class TestFragment extends Fragment {  
  11.   
  12.     public int imageResource = 0;  
  13.   
  14.     public static TestFragment newInstance(int imageResource) {  
  15.         TestFragment newFragment = new TestFragment();  
  16.         newFragment.imageResource = imageResource;  
  17.         return newFragment;  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  23.         View view = inflater.inflate(R.layout.pager_layout, null);  
  24.         ImageView textView = (ImageView) view.findViewById(R.id.image);  
  25.         textView.setImageResource(imageResource);  
  26.         return view;  
  27.     }  
  28.   
  29. }  
(2)ViewPager的Adapter类:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.testa;  
  2.   
  3. import android.support.v4.app.Fragment;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.support.v4.app.FragmentStatePagerAdapter;  
  6.   
  7. public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {  
  8.   
  9.     public MyFragmentPagerAdapter(FragmentManager fm) {  
  10.         super(fm);  
  11.     }  
  12.   
  13.     @Override  
  14.     public int getCount() {  
  15.         return Integer.MAX_VALUE;  
  16.     }  
  17.   
  18.     @Override  
  19.     public Fragment getItem(int arg0) {  
  20.         switch (arg0 % 4) {  
  21.             case 0:  
  22.                 return TestFragment.newInstance(R.drawable.a1);  
  23.             case 1:  
  24.                 return TestFragment.newInstance(R.drawable.default_wh);  
  25.             case 2:  
  26.                 return TestFragment.newInstance(R.drawable.default_ww);  
  27.             case 3:  
  28.                 return TestFragment.newInstance(R.drawable.test);  
  29.             default:  
  30.                 return TestFragment.newInstance(R.drawable.a1);  
  31.         }  
  32.     }  
  33.   
  34. }  
(3)测试的Activity:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.testa;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.os.Bundle;  
  7. import android.support.v4.app.FragmentActivity;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.AbsListView;  
  12. import android.widget.AbsListView.OnScrollListener;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.BaseAdapter;  
  16. import android.widget.TextView;  
  17.   
  18. public class MainActivity extends FragmentActivity {  
  19.   
  20.     private DefinedListView listView = null;  
  21.     private List<String> list = null;  
  22.   
  23.     private DefinedScroller definedScroller = null;  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         listView = (DefinedListView) findViewById(R.id.listview);  
  30.         initListData();  
  31.         initViewPager();  
  32.         listView.setAdapter(new ListAdapter());  
  33.         listView.setOnItemClickListener(new OnItemClickListener() {  
  34.   
  35.             @Override  
  36.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  37.                 definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem() + 1);  
  38.             }  
  39.         });  
  40.   
  41.         listView.setOnScrollListener(new OnScrollListener() {  
  42.   
  43.             @Override  
  44.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  45.                 if (scrollState == SCROLL_STATE_IDLE) {  
  46.                     definedScroller.setShouldAutoScroll();  
  47.                 }  
  48.             }  
  49.   
  50.             @Override  
  51.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  52.   
  53.             }  
  54.         });  
  55.     }  
  56.   
  57.     private void initListData() {  
  58.         list = new ArrayList<String>();  
  59.         for (int i = 1; i <= 20; ++i) {  
  60.             list.add("test" + i);  
  61.         }  
  62.     }  
  63.   
  64.     private void initViewPager() {  
  65.         definedScroller = new DefinedScroller(this);  
  66.         listView.addHeaderView(definedScroller.initView(this));  
  67.     }  
  68.   
  69.     private class ListAdapter extends BaseAdapter {  
  70.   
  71.         @Override  
  72.         public int getCount() {  
  73.             return list.size();  
  74.         }  
  75.   
  76.         @Override  
  77.         public Object getItem(int position) {  
  78.             return list.get(position);  
  79.         }  
  80.   
  81.         @Override  
  82.         public long getItemId(int position) {  
  83.             return position;  
  84.         }  
  85.   
  86.         @Override  
  87.         public View getView(int position, View convertView, ViewGroup parent) {  
  88.             TextView textView = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.text_view_layout,  
  89.                     null);  
  90.             textView.setPadding(20202020);  
  91.             textView.setText(list.get(position));  
  92.             return textView;  
  93.         }  
  94.   
  95.     }  
  96.   
  97. }  
4、布局文件就算了吧


上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。

0 0
原创粉丝点击