自动对齐选择标签的做法

这是一个在我的项目上的功能。现在抽出来分享给大家。




有三个功能:

1、点击下面的日期标签,会变成选中状态,自动跳到上面第一个的位置。

2、滚动停止时,自动判断谁最接近第一个位置,将最接近的那一个变成选中状态,自动对齐到第一个位置。

3、可以向下一直滚,超出最后一个item时,自动选择最后一个item到第一个位置。

(美中不足,选中下面的item时到第一个位置时有白边,在我的项目中没这个问题,可能抽取的代码不完全导致的)


关键代码:

package com.demo;

import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import com.entity.DateModel;
import com.scrollselect.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class MainActivity extends Activity{

	ListView lv_date;
	List<DateModel> dateList;
	DateAdapter dateAdapter;
	int[] lvDateLocation=new int[2];
	int[] lvDateItemLocation=new int[2];
	int dateModelSelectPosition=0;
	int endInvisibleDate=9;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO 自动生成的方法存根
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main);
		
		initDate();
		lv_date=(ListView)findViewById(R.id.listView1);
		lv_date.setAdapter(dateAdapter=new DateAdapter());
		lv_date.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				// TODO 自动生成的方法存根
				lv_date.getLocationInWindow(lvDateLocation);//listview在window中的位置
				view.getLocationInWindow(lvDateItemLocation);//item在window中的位置	
				
				int move=lvDateItemLocation[1]-lvDateLocation[1];
				lv_date.smoothScrollBy(move, 400);
				
				setSelectDate(position);
			}
			
		});
		lv_date.setOnItemLongClickListener(new OnItemLongClickListener(){

			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view, int position,
					long id) {
				// TODO 自动生成的方法存根
				lv_date.getLocationInWindow(lvDateLocation);//listview在window中的位置
				view.getLocationInWindow(lvDateItemLocation);//item在window中的位置	
				
				int move=lvDateItemLocation[1]-lvDateLocation[1];
				lv_date.smoothScrollBy(move, 400);
				
				setSelectDate(position);
				
				return false;
			}
			
		});
		lv_date.setOnScrollListener(new OnScrollListener(){
			
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				// TODO 自动生成的方法存根
				
			}

			@Override
			public void onScrollStateChanged(AbsListView listview, int scrollState) {
				// TODO 自动生成的方法存根
				/*
				 * 第一是静止状态,SCROLL_STATE_IDLE
				 * 第二是手指滚动状态,SCROLL_STATE_TOUCH_SCROLL
				 * 第三是手指不动了,但是屏幕还在滚动状态。SCROLL_STATE_FLING
				 */
				
				if(scrollState==SCROLL_STATE_IDLE){
					
					int position=listview.getFirstVisiblePosition();//在所有item中,第一个显示的item的序号
					
					if(position>=dateList.size()-endInvisibleDate){//已经不可见
						int lastVisiblePosition=dateList.size()-endInvisibleDate-1;
						setSelectDate(lastVisiblePosition);
						lv_date.setSelection(lastVisiblePosition);
						return;
					}
					
					
					lv_date.getLocationInWindow(lvDateLocation);
					View view0=listview.getChildAt(0);//在listview中,第一个显示的item
					View view1=listview.getChildAt(1);//
					
					int[] view0Location=new int[2];
					int[] view1Location=new int[2];
					view0.getLocationInWindow(view0Location);
					view1.getLocationInWindow(view1Location);
					
					
					int move0=view0Location[1]-lvDateLocation[1];
					int move1=view1Location[1]-lvDateLocation[1];
					
					//判断前后两个view谁近目标
					if(Math.abs(move0)<Math.abs(move1)){
						lv_date.smoothScrollBy(move0, 400);
						setSelectDate(position);
					}else{
						lv_date.smoothScrollBy(move1, 400);
						setSelectDate(position+1);
					}
					
					
				}
			}
			
		});
		dateList.get(dateModelSelectPosition).setSelected(true);//第一次进入选择
		
	}
	
	private void initDate(){
		dateList=new LinkedList<DateModel>();
		
		Calendar now = Calendar.getInstance();
		
		int year = now.get(Calendar.YEAR);
		int month = now.get(Calendar.MONTH);
		if(month==12){
			month=1;
			year++;
		}else{
			month++;
		}
		int date = now.get(Calendar.DATE);
		
		for(int i=0;i<40;i++){
			DateModel dm=new DateModel();
			dm.setCalendar(year+"-"+month+"-"+date);
			dm.setDate(""+month+"月"+date+"日");//日期
			
			String strWeek="";
			int week=now.get(Calendar.DAY_OF_WEEK);
			if(week==1){
				strWeek="日";
			}else if(week==2){
				strWeek="一";
			}else if(week==3){
				strWeek="二";
			}else if(week==4){
				strWeek="三";
			}else if(week==5){
				strWeek="四";
			}else if(week==6){
				strWeek="五";
			}else if(week==7){
				strWeek="六";
			}
			dm.setWeek("星期"+strWeek);
			dateList.add(dm);
			
			now.add(Calendar.DAY_OF_MONTH, +1); //向后加1天 
			
			month = now.get(Calendar.MONTH);
			if(month==12){
				month=1;
				year++;
			}else{
				month++;
			}
			date = now.get(Calendar.DATE);
		}
	}
	
	private void setSelectDate(int position){
		if(position==dateModelSelectPosition)return;
		
		dateList.get(position).setSelected(true);
		dateList.get(dateModelSelectPosition).setSelected(false);
		
		dateModelSelectPosition=position;
		dateAdapter.notifyDataSetChanged();
	}
	
	class DateAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			// TODO 自动生成的方法存根
			return dateList.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO 自动生成的方法存根
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO 自动生成的方法存根
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO 自动生成的方法存根
			ViewHolder viewHolder=null;
			if(convertView==null){
				convertView=View.inflate(MainActivity.this, R.layout.item, null);
				
				viewHolder=new ViewHolder(convertView);
				convertView.setTag(viewHolder);
			}else{
				viewHolder=(ViewHolder) convertView.getTag();
			}
			
			//不可见
			if(position+endInvisibleDate>=getCount()){
				convertView.setVisibility(View.INVISIBLE);
				return convertView;
			}else{
				convertView.setVisibility(View.VISIBLE);
			}
			
			//设置数据
			
			
			DateModel dateModel=dateList.get(position);
			viewHolder.tv_circle.setText(dateModel.getWeek());
			viewHolder.tv_bottom.setText(dateModel.getDate());
			if(dateModel.isSelected()){
				viewHolder.tv_circle.setTextColor(Color.rgb(0x11, 0x11, 0x11));
				viewHolder.tv_circle.setBackgroundResource(R.drawable.circle_store_item_selected_bg);
			}else{
				viewHolder.tv_circle.setTextColor(Color.WHITE);
				viewHolder.tv_circle.setBackgroundResource(R.drawable.circle_store_item_bg);
			}
			
			
			return convertView;
		}
		
		
		class ViewHolder{
			public TextView tv_circle;
			public TextView tv_bottom;
			
			public ViewHolder(View view){
				tv_circle=(TextView)view.findViewById(R.id.textView1);
				tv_bottom=(TextView)view.findViewById(R.id.textView2);
			}
		}
		
	}
}


详细demo代码:

http://download.csdn.net/detail/zhengjingle/9519850

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值