面试遇到个问题,给你二十个数据,让这二十个数据在Activity里循环起来,有两种方式来实现,亲测可用,上代码:
```
1.这一种,其实很简单,就是判断滑动到头部和底部的时候,ListView自动弹回到某个位置。
public class ListAdapter extends BaseAdapter
{
private List<String> list;
private Context context;
public ListAdapter(List<String> list,Context context)
{
this.list = list;
this.context = context;
}
//确保总个数使得ListView高度超过手机屏幕高度,以确保能够测试
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position%list.size());
}
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position%list.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.tv_adapter, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.tv.setText(getItem(position).toString());
return convertView;
}
class ViewHolder
{
public ViewHolder(View view) {
// TODO Auto-generated constructor stub
tv = (TextView) view.findViewById(R.id.tv);
}
TextView tv;
}
}
public class MainActivity extends Activity implements OnScrollListener{
ListView listView;
private List<String> list = new ArrayList<String>();
ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
for (int i = 0; i <20; i++) {
list.add(""+i);
}
adapter = new ListAdapter(list);
listView.setAdapter(adapter);
listView.setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
Log.e("第一个可见Item", firstVisibleItem+"");
if (firstVisibleItem<=2) {
listView.setSelection(list.size());
}
else if ((firstVisibleItem + visibleItemCount )== adapter.getCount()) {
listView.setSelection(firstVisibleItem-list.size());
}
}
}
2.第二种,就是比较合理的无限循环了,直接设置getCount为无限大,然后每个Item取余即可。 只需要修改ListAdapter的getCount,getItemId和getView即可 @Override public void getCount() { return Integer.MAX_VALUE; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position%getCount()); }
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position%getCount();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.tv_adapter, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.tv.setText(getItem(position).toString());
return convertView;
}