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

效果图 :

                       

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

思路如下:

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

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

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

主要代码:

package com.example.testview;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewPager_GV_ItemAdapter extends BaseAdapter {

	private List<ChannelInfoBean> list_info;
	private Context context;
	/** ViewPager页码 */
	private int index;
	/** 根据屏幕大小计算得到的每页item个数 */
	private int pageItemCount;
	/** 传进来的List的总长度 */
	private int totalSize;

	/** 当前页item的实际个数 */
	// private int itemRealNum;
	@SuppressWarnings("unchecked")
	public ViewPager_GV_ItemAdapter(Context context, List<?> list) {
		this.context = context;
		this.list_info = (List<ChannelInfoBean>) list;
	}

	public ViewPager_GV_ItemAdapter(Context context, List<?> list, int index, int pageItemCount) {
		this.context = context;
		this.index = index;
		this.pageItemCount = pageItemCount;
		list_info = new ArrayList<ChannelInfoBean>();
		totalSize = list.size();
		// itemRealNum=list.size()-index*pageItemCount;
		// 当前页的item对应的实体在List<?>中的其实下标
		int list_index = index * pageItemCount;
		for (int i = list_index; i < list.size(); i++) {
			list_info.add((ChannelInfoBean) list.get(i));
		}

	}

	@Override
	public int getCount() {
		int size = totalSize / pageItemCount;
		if (index == size)
			return totalSize - pageItemCount * index;
		else
			return pageItemCount;
		// return itemRealNum;
	}

	@Override
	public Object getItem(int arg0) {
		return null;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		ViewHolder iv;
		if (convertView == null)
			iv = new ViewHolder(context, R.layout.channel_gridview_item);
		else
			iv = (ViewHolder) convertView.getTag();
		iv.updateViews(position, null);
		return iv.mView;
	}

	class ViewHolder extends ChannelViewHolder {
		ImageView iv_icon;
		TextView tv_name;

		public ViewHolder(Context context, int resource) {
			super(context, resource);
		}

		@Override
		protected void findViews() {
			iv_icon = (ImageView) mView.findViewById(R.id.iv_gv_item_icon);
			tv_name = (TextView) mView.findViewById(R.id.tv_gv_item_Name);
		}

		@Override
		protected void updateViews(int position, Object inst) {
			// 不管用
			// iv_icon.setBackgroundResource(list_info.get(position).getIconID());
			iv_icon.setImageResource(list_info.get(position).getIconID());
			tv_name.setText(list_info.get(position).getName());
		}
	}

}

GridViewGallery:

package com.example.testview;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * 
 * GridView滑动
 * 
 * @author chenwansong
 * 
 */

public class GridViewGallery extends LinearLayout {

	private Context context;
	/** 保存实体对象链表 */
	private List<ChannelInfoBean> list;
	private ViewPager viewPager;
	private LinearLayout ll_dot;
	private ImageView[] dots;
	/** ViewPager当前页 */
	private int currentIndex;
	/** ViewPager页数 */
	private int viewPager_size;
	/** 默认一页12个item */
	private int pageItemCount = 12;

	/** 保存每个页面的GridView视图 */
	private List<View> list_Views;

	public GridViewGallery(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		this.list = null;
		initView();
	}

	@SuppressWarnings("unchecked")
	public GridViewGallery(Context context, List<?> list) {
		super(context);
		this.context = context;
		this.list = (List<ChannelInfoBean>) list;
		initView();
		initDots();
		setAdapter();
	}

	private void setAdapter() {
		list_Views = new ArrayList<View>();
		for (int i = 0; i < viewPager_size; i++) {
			list_Views.add(getViewPagerItem(i));
		}
		viewPager.setAdapter(new ViewPager_GridView_Adapter(list_Views));
	}

	private void initView() {
		View view = LayoutInflater.from(context).inflate(R.layout.channel_activity, null);
		viewPager = (ViewPager) view.findViewById(R.id.vPager);
		ll_dot = (LinearLayout) view.findViewById(R.id.ll_channel_dots);
		addView(view);
	}

	// 初始化底部小圆点
	private void initDots() {

		// 根据屏幕宽度高度计算pageItemCount

		int width = Util.getWindowWidth(context);
		int high = Util.getWindowHeight(context);

		int col = (width / 160) > 2 ? (width / 160) : 3;
		int row = (high / 200) > 4 ? (high / 200) : 4;

		pageItemCount = col * row;
		viewPager_size = list.size() / pageItemCount + 1;

		if (0 < viewPager_size) {
			ll_dot.removeAllViews();
			if (1 == viewPager_size) {
				ll_dot.setVisibility(View.GONE);
			} else if (1 < viewPager_size) {
				ll_dot.setVisibility(View.VISIBLE);
				for (int j = 0; j < viewPager_size; j++) {
					ImageView image = new ImageView(context);
					LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
					params.setMargins(3, 0, 3, 0);
					image.setBackgroundResource(R.drawable.channel_dot);
					ll_dot.addView(image, params);
				}
			}
		}
		if (viewPager_size != 1) {
			dots = new ImageView[viewPager_size];
			for (int i = 0; i < viewPager_size; i++) {
				dots[i] = (ImageView) ll_dot.getChildAt(i);
				dots[i].setEnabled(true);
				dots[i].setTag(i);
			}
			currentIndex = 0;
			dots[currentIndex].setEnabled(false);
			viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

				@Override
				public void onPageSelected(int arg0) {
					setCurDot(arg0);
				}

				@Override
				public void onPageScrolled(int arg0, float arg1, int arg2) {
					// TODO Auto-generated method stub

				}

				@Override
				public void onPageScrollStateChanged(int arg0) {
					// TODO Auto-generated method stub

				}
			});
		}
	}

	/** 当前底部小圆点 */
	private void setCurDot(int positon) {
		if (positon < 0 || positon > viewPager_size - 1 || currentIndex == positon) {
			return;
		}
		dots[positon].setEnabled(false);
		dots[currentIndex].setEnabled(true);
		currentIndex = positon;
	}

	private View getViewPagerItem(int index) {
		LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View layout = inflater.inflate(R.layout.channel_viewpage_gridview, null);
		GridView gridView = (GridView) layout.findViewById(R.id.vp_gv);

		int width = Util.getWindowWidth(context);
		int col = (width / 160) > 2 ? (width / 160) : 3;
		gridView.setNumColumns(col);

		ViewPager_GV_ItemAdapter adapter = new ViewPager_GV_ItemAdapter(context, list, index, pageItemCount);

		gridView.setAdapter(adapter);
		gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				if (null != list.get(position + currentIndex * pageItemCount).getOnClickListener())
					list.get(position + currentIndex * pageItemCount).getOnClickListener().ongvItemClickListener(view);
			}
		});
		return gridView;
	}
}


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

package com.example.testview;

import java.util.Collections;
import java.util.List;

import android.graphics.drawable.Drawable;
import android.view.View;

public class ChannelInfoBean  implements Comparable<ChannelInfoBean> {
	private int id;
	private String name;
	private Drawable icon;
	private String iconUrl;
	private int iconID;
	private String describtion;
	private int type;
	// 排序标记
	private int order;
	private onGridViewItemClickListener onClickListener;
	

	public ChannelInfoBean(String name, int iconID, int order) {
		super();
		this.name = name;
		this.iconID = iconID;
		this.order = order;
	}
	public ChannelInfoBean(String name, int iconID, int order,onGridViewItemClickListener onClickListener) {
		super();
		this.name = name;
		this.iconID = iconID;
		this.order = order;
		this.onClickListener=onClickListener;
	}


	public ChannelInfoBean(int id, String name, Drawable icon, String iconUrl, int iconID, int type, int order, String describtion) {
		super();
		this.id = id;
		this.name = name;
		this.icon = icon;
		this.iconUrl = iconUrl;
		this.iconID = iconID;
		this.type = type;
		this.order = order;
		this.describtion = describtion;
	}

	
	
	
	public onGridViewItemClickListener getOnClickListener() {
		return onClickListener;
	}
	public void setOnClickListener(onGridViewItemClickListener onClickListener) {
		this.onClickListener = onClickListener;
	}
	public String getIconUrl() {
		return iconUrl;
	}

	public void setIconUrl(String iconUrl) {
		this.iconUrl = iconUrl;
	}

	public int getIconID() {
		return iconID;
	}

	public void setIconID(int iconID) {
		this.iconID = iconID;
	}

	public String getIconurl() {
		return iconUrl;
	}

	public void setIconurl(String iconurl) {
		this.iconUrl = iconurl;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Drawable getIcon() {
		return icon;
	}

	public void setIcon(Drawable icon) {
		this.icon = icon;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	public String getDescribtion() {
		return describtion;
	}

	public void setDescribtion(String describtion) {
		this.describtion = describtion;
	}

	@Override
	public int compareTo(ChannelInfoBean info) {
		if (info != null) {
			if (this.getOrder() > info.getOrder()) {
				return 1;
			} else {
				return -1;
			}
		} else {
			return 0;
		}
	}
	
	

	//得到排序的List
	public static List<ChannelInfoBean> getOrderList(List<ChannelInfoBean> list) {
		Collections.sort(list);
		return list;
	}
	
	
	
	public interface onGridViewItemClickListener
	{
		public abstract void ongvItemClickListener(View v);
	}
	

}

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

  • 21
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 73
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值