首页 > 代码库 > android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)

android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)

效果图 :

                       

分别是第一页、第二页、第三页,随手截的图,不整齐,勿见怪。开始走了弯路,废了不少时间。

思路如下:

1、用ViewPager实现左右分页滑动,布局最下面远点标记页码是根据有多个item动态添加的。

2、每个页面的GridView的item的个数根据屏幕的宽度高度来动态设置。

3、每个界面的GridView的adapter也是根据当前页面的itemCount来动态设置的。

主要代码:

[java] view plaincopy
  1. package com.example.testview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.ImageView;  
  11. import android.widget.TextView;  
  12.   
  13. public class ViewPager_GV_ItemAdapter extends BaseAdapter {  
  14.   
  15.     private List<ChannelInfoBean> list_info;  
  16.     private Context context;  
  17.     /** ViewPager页码 */  
  18.     private int index;  
  19.     /** 根据屏幕大小计算得到的每页item个数 */  
  20.     private int pageItemCount;  
  21.     /** 传进来的List的总长度 */  
  22.     private int totalSize;  
  23.   
  24.     /** 当前页item的实际个数 */  
  25.     // private int itemRealNum;  
  26.     @SuppressWarnings("unchecked")  
  27.     public ViewPager_GV_ItemAdapter(Context context, List<?> list) {  
  28.         this.context = context;  
  29.         this.list_info = (List<ChannelInfoBean>) list;  
  30.     }  
  31.   
  32.     public ViewPager_GV_ItemAdapter(Context context, List<?> list, int index, int pageItemCount) {  
  33.         this.context = context;  
  34.         this.index = index;  
  35.         this.pageItemCount = pageItemCount;  
  36.         list_info = new ArrayList<ChannelInfoBean>();  
  37.         totalSize = list.size();  
  38.         // itemRealNum=list.size()-index*pageItemCount;  
  39.         // 当前页的item对应的实体在List<?>中的其实下标  
  40.         int list_index = index * pageItemCount;  
  41.         for (int i = list_index; i < list.size(); i++) {  
  42.             list_info.add((ChannelInfoBean) list.get(i));  
  43.         }  
  44.   
  45.     }  
  46.   
  47.     @Override  
  48.     public int getCount() {  
  49.         int size = totalSize / pageItemCount;  
  50.         if (index == size)  
  51.             return totalSize - pageItemCount * index;  
  52.         else  
  53.             return pageItemCount;  
  54.         // return itemRealNum;  
  55.     }  
  56.   
  57.     @Override  
  58.     public Object getItem(int arg0) {  
  59.         return null;  
  60.     }  
  61.   
  62.     @Override  
  63.     public long getItemId(int position) {  
  64.         return position;  
  65.     }  
  66.   
  67.     @Override  
  68.     public View getView(int position, View convertView, ViewGroup parent) {  
  69.   
  70.         ViewHolder iv;  
  71.         if (convertView == null)  
  72.             iv = new ViewHolder(context, R.layout.channel_gridview_item);  
  73.         else  
  74.             iv = (ViewHolder) convertView.getTag();  
  75.         iv.updateViews(position, null);  
  76.         return iv.mView;  
  77.     }  
  78.   
  79.     class ViewHolder extends ChannelViewHolder {  
  80.         ImageView iv_icon;  
  81.         TextView tv_name;  
  82.   
  83.         public ViewHolder(Context context, int resource) {  
  84.             super(context, resource);  
  85.         }  
  86.   
  87.         @Override  
  88.         protected void findViews() {  
  89.             iv_icon = (ImageView) mView.findViewById(R.id.iv_gv_item_icon);  
  90.             tv_name = (TextView) mView.findViewById(R.id.tv_gv_item_Name);  
  91.         }  
  92.   
  93.         @Override  
  94.         protected void updateViews(int position, Object inst) {  
  95.             // 不管用  
  96.             // iv_icon.setBackgroundResource(list_info.get(position).getIconID());  
  97.             iv_icon.setImageResource(list_info.get(position).getIconID());  
  98.             tv_name.setText(list_info.get(position).getName());  
  99.         }  
  100.     }  
  101.   
  102. }  


GridViewGallery:

[java] view plaincopy
  1. package com.example.testview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.content.Context;  
  7. import android.support.v4.view.ViewPager;  
  8. import android.util.AttributeSet;  
  9. import android.view.LayoutInflater;  
  10. import android.view.View;  
  11. import android.widget.AdapterView;  
  12. import android.widget.AdapterView.OnItemClickListener;  
  13. import android.widget.GridView;  
  14. import android.widget.ImageView;  
  15. import android.widget.LinearLayout;  
  16.   
  17. /** 
  18.  *  
  19.  * GridView滑动 
  20.  *  
  21.  * @author chenwansong 
  22.  *  
  23.  */  
  24.   
  25. public class GridViewGallery extends LinearLayout {  
  26.   
  27.     private Context context;  
  28.     /** 保存实体对象链表 */  
  29.     private List<ChannelInfoBean> list;  
  30.     private ViewPager viewPager;  
  31.     private LinearLayout ll_dot;  
  32.     private ImageView[] dots;  
  33.     /** ViewPager当前页 */  
  34.     private int currentIndex;  
  35.     /** ViewPager页数 */  
  36.     private int viewPager_size;  
  37.     /** 默认一页12个item */  
  38.     private int pageItemCount = 12;  
  39.   
  40.     /** 保存每个页面的GridView视图 */  
  41.     private List<View> list_Views;  
  42.   
  43.     public GridViewGallery(Context context, AttributeSet attrs) {  
  44.         super(context, attrs);  
  45.         this.context = context;  
  46.         this.list = null;  
  47.         initView();  
  48.     }  
  49.   
  50.     @SuppressWarnings("unchecked")  
  51.     public GridViewGallery(Context context, List<?> list) {  
  52.         super(context);  
  53.         this.context = context;  
  54.         this.list = (List<ChannelInfoBean>) list;  
  55.         initView();  
  56.         initDots();  
  57.         setAdapter();  
  58.     }  
  59.   
  60.     private void setAdapter() {  
  61.         list_Views = new ArrayList<View>();  
  62.         for (int i = 0; i < viewPager_size; i++) {  
  63.             list_Views.add(getViewPagerItem(i));  
  64.         }  
  65.         viewPager.setAdapter(new ViewPager_GridView_Adapter(list_Views));  
  66.     }  
  67.   
  68.     private void initView() {  
  69.         View view = LayoutInflater.from(context).inflate(R.layout.channel_activity, null);  
  70.         viewPager = (ViewPager) view.findViewById(R.id.vPager);  
  71.         ll_dot = (LinearLayout) view.findViewById(R.id.ll_channel_dots);  
  72.         addView(view);  
  73.     }  
  74.   
  75.     // 初始化底部小圆点  
  76.     private void initDots() {  
  77.   
  78.         // 根据屏幕宽度高度计算pageItemCount  
  79.   
  80.         int width = Util.getWindowWidth(context);  
  81.         int high = Util.getWindowHeight(context);  
  82.   
  83.         int col = (width / 160) > 2 ? (width / 160) : 3;  
  84.         int row = (high / 200) > 4 ? (high / 200) : 4;  
  85.   
  86.         pageItemCount = col * row;  
  87.         viewPager_size = list.size() / pageItemCount + 1;  
  88.   
  89.         if (0 < viewPager_size) {  
  90.             ll_dot.removeAllViews();  
  91.             if (1 == viewPager_size) {  
  92.                 ll_dot.setVisibility(View.GONE);  
  93.             } else if (1 < viewPager_size) {  
  94.                 ll_dot.setVisibility(View.VISIBLE);  
  95.                 for (int j = 0; j < viewPager_size; j++) {  
  96.                     ImageView image = new ImageView(context);  
  97.                     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);  
  98.                     params.setMargins(3, 0, 3, 0);  
  99.                     image.setBackgroundResource(R.drawable.channel_dot);  
  100.                     ll_dot.addView(image, params);  
  101.                 }  
  102.             }  
  103.         }  
  104.         if (viewPager_size != 1) {  
  105.             dots = new ImageView[viewPager_size];  
  106.             for (int i = 0; i < viewPager_size; i++) {  
  107.                 dots[i] = (ImageView) ll_dot.getChildAt(i);  
  108.                 dots[i].setEnabled(true);  
  109.                 dots[i].setTag(i);  
  110.             }  
  111.             currentIndex = 0;  
  112.             dots[currentIndex].setEnabled(false);  
  113.             viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
  114.   
  115.                 @Override  
  116.                 public void onPageSelected(int arg0) {  
  117.                     setCurDot(arg0);  
  118.                 }  
  119.   
  120.                 @Override  
  121.                 public void onPageScrolled(int arg0, float arg1, int arg2) {  
  122.                     // TODO Auto-generated method stub  
  123.   
  124.                 }  
  125.   
  126.                 @Override  
  127.                 public void onPageScrollStateChanged(int arg0) {  
  128.                     // TODO Auto-generated method stub  
  129.   
  130.                 }  
  131.             });  
  132.         }  
  133.     }  
  134.   
  135.     /** 当前底部小圆点 */  
  136.     private void setCurDot(int positon) {  
  137.         if (positon < 0 || positon > viewPager_size - 1 || currentIndex == positon) {  
  138.             return;  
  139.         }  
  140.         dots[positon].setEnabled(false);  
  141.         dots[currentIndex].setEnabled(true);  
  142.         currentIndex = positon;  
  143.     }  
  144.   
  145.     private View getViewPagerItem(int index) {  
  146.         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  147.         View layout = inflater.inflate(R.layout.channel_viewpage_gridview, null);  
  148.         GridView gridView = (GridView) layout.findViewById(R.id.vp_gv);  
  149.   
  150.         int width = Util.getWindowWidth(context);  
  151.         int col = (width / 160) > 2 ? (width / 160) : 3;  
  152.         gridView.setNumColumns(col);  
  153.   
  154.         ViewPager_GV_ItemAdapter adapter = new ViewPager_GV_ItemAdapter(context, list, index, pageItemCount);  
  155.   
  156.         gridView.setAdapter(adapter);  
  157.         gridView.setOnItemClickListener(new OnItemClickListener() {  
  158.   
  159.             @Override  
  160.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  161.                 if (null != list.get(position + currentIndex * pageItemCount).getOnClickListener())  
  162.                     list.get(position + currentIndex * pageItemCount).getOnClickListener().ongvItemClickListener(view);  
  163.             }  
  164.         });  
  165.         return gridView;  
  166.     }  
  167. }  



实体类(贴上来没啥用,主要是处理不同item的点击事件的时候,这么处理的:定义了一个点击的事件接口,实例化的时候实现这个item需要做的事情):

[java] view plaincopy
  1. package com.example.testview;  
  2.   
  3. import java.util.Collections;  
  4. import java.util.List;  
  5.   
  6. import android.graphics.drawable.Drawable;  
  7. import android.view.View;  
  8.   
  9. public class ChannelInfoBean  implements Comparable<ChannelInfoBean> {  
  10.     private int id;  
  11.     private String name;  
  12.     private Drawable icon;  
  13.     private String iconUrl;  
  14.     private int iconID;  
  15.     private String describtion;  
  16.     private int type;  
  17.     // 排序标记  
  18.     private int order;  
  19.     private onGridViewItemClickListener onClickListener;  
  20.       
  21.   
  22.     public ChannelInfoBean(String name, int iconID, int order) {  
  23.         super();  
  24.         this.name = name;  
  25.         this.iconID = iconID;  
  26.         this.order = order;  
  27.     }  
  28.     public ChannelInfoBean(String name, int iconID, int order,onGridViewItemClickListener onClickListener) {  
  29.         super();  
  30.         this.name = name;  
  31.         this.iconID = iconID;  
  32.         this.order = order;  
  33.         this.onClickListener=onClickListener;  
  34.     }  
  35.   
  36.   
  37.     public ChannelInfoBean(int id, String name, Drawable icon, String iconUrl, int iconID, int type, int order, String describtion) {  
  38.         super();  
  39.         this.id = id;  
  40.         this.name = name;  
  41.         this.icon = icon;  
  42.         this.iconUrl = iconUrl;  
  43.         this.iconID = iconID;  
  44.         this.type = type;  
  45.         this.order = order;  
  46.         this.describtion = describtion;  
  47.     }  
  48.   
  49.       
  50.       
  51.       
  52.     public onGridViewItemClickListener getOnClickListener() {  
  53.         return onClickListener;  
  54.     }  
  55.     public void setOnClickListener(onGridViewItemClickListener onClickListener) {  
  56.         this.onClickListener = onClickListener;  
  57.     }  
  58.     public String getIconUrl() {  
  59.         return iconUrl;  
  60.     }  
  61.   
  62.     public void setIconUrl(String iconUrl) {  
  63.         this.iconUrl = iconUrl;  
  64.     }  
  65.   
  66.     public int getIconID() {  
  67.         return iconID;  
  68.     }  
  69.   
  70.     public void setIconID(int iconID) {  
  71.         this.iconID = iconID;  
  72.     }  
  73.   
  74.     public String getIconurl() {  
  75.         return iconUrl;  
  76.     }  
  77.   
  78.     public void setIconurl(String iconurl) {  
  79.         this.iconUrl = iconurl;  
  80.     }  
  81.   
  82.     public int getId() {  
  83.         return id;  
  84.     }  
  85.   
  86.     public void setId(int id) {  
  87.         this.id = id;  
  88.     }  
  89.   
  90.     public String getName() {  
  91.         return name;  
  92.     }  
  93.   
  94.     public void setName(String name) {  
  95.         this.name = name;  
  96.     }  
  97.   
  98.     public Drawable getIcon() {  
  99.         return icon;  
  100.     }  
  101.   
  102.     public void setIcon(Drawable icon) {  
  103.         this.icon = icon;  
  104.     }  
  105.   
  106.     public int getType() {  
  107.         return type;  
  108.     }  
  109.   
  110.     public void setType(int type) {  
  111.         this.type = type;  
  112.     }  
  113.   
  114.     public int getOrder() {  
  115.         return order;  
  116.     }  
  117.   
  118.     public void setOrder(int order) {  
  119.         this.order = order;  
  120.     }  
  121.   
  122.     public String getDescribtion() {  
  123.         return describtion;  
  124.     }  
  125.   
  126.     public void setDescribtion(String describtion) {  
  127.         this.describtion = describtion;  
  128.     }  
  129.   
  130.     @Override  
  131.     public int compareTo(ChannelInfoBean info) {  
  132.         if (info != null) {  
  133.             if (this.getOrder() > info.getOrder()) {  
  134.                 return 1;  
  135.             } else {  
  136.                 return -1;  
  137.             }  
  138.         } else {  
  139.             return 0;  
  140.         }  
  141.     }  
  142.       
  143.       
  144.   
  145.     //得到排序的List  
  146.     public static List<ChannelInfoBean> getOrderList(List<ChannelInfoBean> list) {  
  147.         Collections.sort(list);  
  148.         return list;  
  149.     }  
  150.       
  151.       
  152.       
  153.     public interface onGridViewItemClickListener  
  154.     {  
  155.         public abstract void ongvItemClickListener(View v);  
  156.     }  
  157.       
  158.   
  159. }  


把这几个自我感觉比较麻烦的类贴上来,有需要的可以看看。