两种方式打造无限循环ListView

面试遇到个问题,给你二十个数据,让这二十个数据在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;
	}

第一种无限循环 第二种无限循环

   
        

转载于:https://my.oschina.net/lengwei/blog/465473

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值