类似淘宝头条,走马灯上下滚动

类似淘宝头条,走马灯上下滚动。


主要java类为 ScrollTopView.java,实现滚动效果

package com.example.taobaohead.headview;

import java.util.List;

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;
import android.widget.TextView;

import com.example.taobaohead.BeanVo;
import com.example.taobaohead.R;
import com.example.taobaohead.inteface.OnAdapterClickListener;

/*
 * 类似淘宝 、头条
 * auto cainiaozheng
 */
public class ScrollTopView extends LinearLayout {

	private Scroller mScroller;  //滚动实例

	private List<BeanVo> articleList;  //存放数据集合
	private final int DURING_TIME = 2000;  //滚动延迟
	private OnAdapterClickListener<BeanVo> click;  

	public ScrollTopView(Context context) {
		super(context);
		init();
	}

	public ScrollTopView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	private void init() {
		mScroller = new Scroller(getContext());
	}

	/**
	 * 设置数据
	 * @param articleList
	 */
	public void setData(List<BeanVo> articleList) {
		this.articleList = articleList;
		if (articleList != null) {
			removeAllViews();
			Log.i("tag", articleList.size() + "");
			int size = articleList.size() > 1 ? 4 : articleList.size();
			for (int i = 0; i < size; i++) {
				addContentView(i);
			}
			if (articleList.size() > 3) {
				getLayoutParams().height = Utils.dip2px(50);  //调节滚动数据的高度
				// 滚动
				cancelAuto();
				mHandler.sendEmptyMessageDelayed(0, DURING_TIME);
				smoothScrollBy(0, Utils.dip2px(50));
			}
		}
	}

	/**
	 * 设置列表点击事件
	 * 
	 * @param click
	 */
	public void setClickListener(OnAdapterClickListener<BeanVo> click) {
		this.click = click;
	}

	/**
	 * 重置数据
	 */
	private void resetView() {
		BeanVo article = articleList.get(0);
		articleList.remove(0);
		articleList.add(article);

		for (int i = 0; i < 4; i++) {
			addContentView(i);
		}
	}

	/**
	 * 取消滚动
	 */
	public void cancelAuto() {
		mHandler.removeMessages(0);
	}

	private void addContentView(int position) {
		ViewHolder mHolder;
		if (position >= getChildCount()) {
			mHolder = new ViewHolder();
			View v = View.inflate(getContext(), R.layout.myhead, null);
			mHolder.nameTv = (TextView) v.findViewById(R.id.tv);
			v.setTag(mHolder);
			addView(v, LayoutParams.MATCH_PARENT, Utils.dip2px(50));
		} else {
			mHolder = (ViewHolder) getChildAt(position).getTag();
		}
		final BeanVo article = articleList.get(position);
		mHolder.nameTv.setText(article.getName());
		mHolder.nameTv.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (click != null) {
					click.onAdapterClick(null, article);
				}
				// if(null != article){
				// Intent intent = new Intent(getContext(),
				// CareHairDetailActivity.class);
				// intent.putExtra("id", article.getId());
				// intent.putExtra("name", article.getName());
				// getContext().startActivity(intent);
				// }
			}
		});
	}

	private class ViewHolder {
		TextView nameTv;
	}

	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			mHandler.removeMessages(0);
			mHandler.sendEmptyMessageDelayed(0, DURING_TIME);
			smoothScrollBy(0, Utils.dip2px(50));
			resetView();
		};
	};

	// 调用此方法设置滚动的相对偏移
	public void smoothScrollBy(int dx, int dy) {
		// 设置mScroller的滚动偏移量
		mScroller.startScroll(mScroller.getFinalX(), 0, dx, dy, DURING_TIME);
		invalidate();// 这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
	}

	@Override
	public void computeScroll() {

		// 先判断mScroller滚动是否完成
		if (mScroller.computeScrollOffset()) {

			// 这里调用View的scrollTo()完成实际的滚动
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			// 必须调用该方法,否则不一定能看到滚动效果
			postInvalidate();

		}
		super.computeScroll();
	}
}


布局文件MainActivity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.taobaohead.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="淘宝头条"
        android:textSize="18sp" />

    <com.example.taobaohead.headview.ScrollTopView
        android:id="@+id/mytaobao"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="100dp"
        android:orientation="vertical" />

</RelativeLayout>


在MainActivity.java类里设置数据放入ScrollTopView自定义组件中,并对其数据进行监听,如下:

List<BeanVo> list = new ArrayList<BeanVo>();
		BeanVo vo = new BeanVo("age", "zgz");
		BeanVo vo1 = new BeanVo("age1", "zgz1");
		BeanVo vo2 = new BeanVo("age2", "zgz2");
		BeanVo vo3 = new BeanVo("age3", "zgz3");
		list.add(vo1);
		list.add(vo2);
		list.add(vo3);
		list.add(vo);
		mytaobao = (ScrollTopView) findViewById(R.id.mytaobao);

		mytaobao.setData(list);
		mytaobao.setClickListener(new OnAdapterClickListener<BeanVo>() {
			Intent intent;

			@Override
			public void onAdapterClick(View v, BeanVo t) {
				intent = new Intent(MainActivity.this, TopIntent.class);
				intent.putExtra("name", t.getName());
				intent.putExtra("age", t.getAge());
				startActivity(intent);
			}
		});


详细代码下载,请查看:http://download.csdn.net/detail/aaaaaa3334/9408360







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值