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

    效果图 :

                           

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

    思路如下:

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

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

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

    主要代码:

    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:

    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需要做的事情):

    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. }  


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

  • 相关阅读:
    C语言判断函数
    从函数调用来思考多态
    C语言读取每一行文本
    任务栏上的资源管理器图标,没有jump list?其他都有。
    The specified child already has a parent错误
    SQL语句的添加、删除、修改多种方法
    菜鸟开技术博啦
    若不能连接到sql server的localhost
    微软Live Mail包含重大Bug,可导致用户无法登录,我已经一个多月无法登录自己的邮箱了。 无为而为
    试试Communicator Web Access 中文版 无为而为
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3895078.html
Copyright © 2011-2022 走看看