背景
有个朋友小王去面试,回来后跟我交流说面试官给他看了一款app,上面有个自动滚动的效果显示信息,问他有什么思路实现。当然这种效果的实现方式有很多种,可以重写listview。当然也有别的方法,搜集信息后决定用Timer的TimeTaskScroll+listview就能实现。
实例
代码很简单,这里就直接贴出来。
- activity_main.xml 里面就一个简单的listview
<?xml version="1.0" encoding="utf-8"?>
<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">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
</RelativeLayout>
- item_listview.xml item布局,就放一个textview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_item_listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="content"
android:textSize="18sp"/>
</LinearLayout>
- MainActivity
//滚动的listview
public class MainActivity extends AppCompatActivity {
ListView mListView;
List<String> mList;
ListviewAdapter mListviewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView= (ListView) findViewById(R.id.listview);
mList=new ArrayList<>();
for (int i=0;i<20;i++){
mList.add("count"+i);
}
mListviewAdapter =new ListviewAdapter(this,mList);
mListView.setAdapter(mListviewAdapter);
//设定任务
new Timer().schedule(new TimeTaskScroll(this, mListView), 100, 100);
}
}
- TimeTaskScroll
英文单词就可以看出是一个滚动的任务
/**
* Created by melo on 2017/2/13.
*/
public class TimeTaskScroll extends TimerTask {
private ListView listView;
public TimeTaskScroll(Context context, ListView listView) {
this.listView = listView;
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 控制速度
listView.smoothScrollBy(5, 0);
}
};
@Override
public void run() {
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
}
- ListviewAdapter
/**
* Created by melo on 2017/2/13.
*/
public class ListviewAdapter extends BaseAdapter {
private List<String> mList;
private Context mContext;
private ViewHolder holder;
public ListviewAdapter(Context context, List<String> list) {
mContext = context;
mList = list;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return mList.get(position % mList.size());
}
@Override
public long getItemId(int position) {
return position % mList.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_listview, null);
holder=new ViewHolder();
holder.tv_item_listview= (TextView) convertView.findViewById(R.id.tv_item_listview);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
holder.tv_item_listview.setText("第"+(position % mList.size()+1)+"个");
return convertView;
}
class ViewHolder {
TextView tv_item_listview;
}
}
效果图
注意事项
值得注意的地方,当我们不在当前页面的时候我们需要停止listview的滚动,以免浪费资源。在生命周期中我们会调用 mTimer.cancel();但是一旦timer被执行了cancel()方法,在重新启动定时器的时候,必须重新实例化TimerTask才可以,不然就会报错。每个定时器任务task只能被放置一次。