类似淘宝头条,走马灯上下滚动。
主要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>
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