在实际开发中,会遇到让数据循环播放的效果,因此,在这里我用listview加一个定时器,做一个简单的让listview上滑的效果。
首先,是xml布局文件,就是一个简单listview即可
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scrollbars="none"
></ListView>
其中,android:layout_height="match_parent" 可以根据自己的实际需要,显示一条还是几条来更改高度,我在这里是让他全屏显示的。
来给listview写一个item,一般这种轮播都是一条一行的,所以就简单来个这样的就行了
<?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="horizontal">
<TextView
android:id="@+id/num_tv"
android:padding="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="编号" />
<TextView
android:id="@+id/name_tv"
android:padding="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字" />
</LinearLayout>
轮播的是数据,首先随便写一个实体类,根据上面的item,一个编号,一个名称,足矣。
public class Course {
private String id;
private String name;
public Course(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
listview都需要适配器的,都懂的
public class DemoAdapter extends BaseAdapter{
private Context mContext;
private List<Course> mData;
public DemoAdapter(Context mContext, List<Course> mData) {
this.mContext = mContext;
this.mData = mData;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return mData.get(position % mData.size());
}
@Override
public long getItemId(int position) {
return position % mData.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_items, null);
viewHolder.num_tv = (TextView) convertView.findViewById(R.id.num_tv);
viewHolder.name_tv = (TextView) convertView.findViewById(R.id.name_tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Course course = mData.get(position % mData.size());
viewHolder.num_tv.setText(course.getId());
viewHolder.name_tv.setText(course.getName());
return convertView;
}
class ViewHolder {
private TextView num_tv, name_tv;
}
}
因为我们要实现轮播效果,就是不管listview的数据有几条,咱们都是循环播放着来的,不会翻到最后就停了,也会显得数据多,是吧。所以,就让 getCount() 返回最大值,即Integer.MAX_VALUE;后面的就无需多言了,都懂得。
一切准备就绪,完整Activity代码如下,自己看吧。
public class MainActivity extends AppCompatActivity {
private DemoAdapter adapter;
private List<Course> courseList;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initListView();
}
private void initListView() {
listView = (ListView) findViewById(R.id.listview);
courseList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
courseList.add(new Course("编号" + i, "名字" + i));
}
adapter = new DemoAdapter(this,courseList);
listView.setAdapter(adapter);
listScrollUp();
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
handler.removeCallbacks(run_scroll_up);
}
};
/**
* 向上滚动
*/
public void listScrollUp() {
handler.postDelayed(run_scroll_up, 0);
}
Runnable run_scroll_up = new Runnable() {
@Override
public void run() {
/**
* public void smoothScrollBy (int distance, int duration)
*
* Added in API level 8 Smoothly scroll by distance pixels over duration milliseconds.
*
* Parameters
* distance Distance to scroll in pixels.
* duration Duration of the scroll animation in milliseconds.
*/
listView.smoothScrollBy(1, 8);
handler.postDelayed(run_scroll_up, 10);
}
};
}