ListView-2滑动监听与添加头尾,加载布局文件的方式
listview中适配器getView方法里获取获取布局控件的方法:
//第一种--获得布局加载器
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.listview_item_city, null);
//第二种
LayoutInflater layoutInflater2 = LayoutInflater.from(MainActivity.this);
View view = layoutInflater2.inflate(R.layout.listview_item_city, null);
//第三种
LayoutInflater layoutInflater = MainActivity.this.getLayoutInflater();
View view = layoutInflater2.inflate(R.layout.listview_item_city, null);
//第四种
View view = View.inflate(MainActivity.this, R.layout.listview_item_city, null);
这四种方式的区别见:LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的使用
单击事件获取单击的数据见: Spinner-下拉列表
public class MainActivity extends Activity { protected static final String TAG = "MainActivity"; private String[] citys = new String[]{"杭州","乌镇","宁波","九堡","菲律宾","日本","朝鲜","杭州","乌镇","宁波","九堡","菲律宾","日本","朝鲜",}; private ListView lvText; private MyBaseAdapter myBaseAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvText = (ListView) findViewById(R.id.lv_city); //自定义适配器 myBaseAdapter = new MyBaseAdapter(); lvText.setAdapter(myBaseAdapter); //设置item点击事件 lvText.setOnItemClickListener(new OnItemClickListener() { //当点击适配器控件的item的时候调用 // AdapterView<?> parent, 表示的是设置该适配器的适配器控件 // View view, 表示的是被点击的item的view // int position, 表示的是与被点击的item的view的索引 // long id 表示id,该值与getitemid的返回值对应 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Log.i(TAG, "MainActivity--onItemClick--position" + position + "--id--" + id); } }); //设置长按事件 lvText.setOnItemLongClickListener(new OnItemLongClickListener() { //当用户点击item时间超过2s就会触发长按事件,如果同时设置了单击事件,会先触发长按,松开手指时会触发单击事件 //返回值 false 表示该方法不处理该事件(不消耗该事件),事件会交给其他的方法去处理 //true,表示该方法消耗了该事件,该事件就不会给其他方法调用 @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // Log.i(TAG, "MainActivity--onItemLongClick--position--" + position); //获取数据的四种方法 String dataArray = citys[position]; String dataAdapter = (String) myBaseAdapter.getItem(position); String datalv = (String) lvText.getItemAtPosition(position); String dataParent = (String)parent.getItemAtPosition(position); Log.i(TAG, "MainActivity--onItemLongClick--" + dataArray + "--" +dataAdapter +"--"+datalv +"--" +dataParent); return true;//就不会执行单击事件了 } }); } }
ListView的滑动监听事件:
listView.setOnScrollListener(new OnScrollListener() { /* * 当滚动状态改变的时候调用 scrollState 表示的是滚动状态 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // OnScrollListener.SCROLL_STATE_FLING; 表示惯性滚动状态 --2 // OnScrollListener.SCROLL_STATE_IDLE; 表示停止滚动 --0 // OnScrollListener.SCROLL_STATE_TOUCH_SCROLL; 表示手指触摸滚动 --1 //1.滑动到屏幕最低端 2.停止滚动 if(scrollState == OnScrollListener.SCROLL_STATE_IDLE && isBottom){ Log.i(TAG, "isbottom");//滑动到最底部且松手了就刷新添加数据 } } /* * 当listview滚动的时候调用,第一次加载时也会调用 AbsListView view, int * firstVisibleItem,表达的是当前屏幕显示的第一条数据的索引 int visibleItemCount, * 表示的是当前屏幕显示的item的总数 int totalItemCount 表示的适配器数据的总数量 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { isBottom = (firstVisibleItem + visibleItemCount == totalItemCount); } });
为ListView添加头和尾:
public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData()); //得到头和尾的布局文件 注意必须是添加布局文件,而不是控件,不然会报错的 View head = View.inflate(this, R.layout.listview_head, null); View end = View.inflate(this, R.layout.listview_end, null); listView.addHeaderView(head);//添加头,注意头必须在添加适配器之前添加,否则报错 listView.setAdapter(adapter); listView.addFooterView(end);//添加尾,可以在适配器后添加,也可之前添加 //包含头的单机事件,但是不包含尾的单机事件,并且头占了一个下标 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(position>0){ System.out.println("点击了--"+parent.getItemAtPosition(position)); }else{ System.out.println("点击了ListView的头(图片)"); } } }); //为按钮(ListView的尾部)添加单击事件 end.findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("点击了按钮"); } }); } private ArrayList<String> getData(){ ArrayList<String> list=new ArrayList<String>(); for(int i=0;i<20;i++){ list.add("文本---"+i); } return list; } }
利用滑动监听添加上拉加载:
/** * 上拉加载更多ListView */ public class LoadMoreListView extends ListView implements OnScrollListener { private View footer; int totalItemCount;// 总数量; int lastVisibleItem;// 最后一个可见的item; boolean isLoading;// 正在加载; ILoadListener iLoadListener; public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } public LoadMoreListView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public LoadMoreListView(Context context) { super(context); initView(context); } /** * 添加底部加载提示布局到listview * * @param context */ @SuppressLint("InflateParams") private void initView(Context context) { LayoutInflater inflater = LayoutInflater.from(context); footer = inflater.inflate(R.layout.layout_list_footer, null); footer.findViewById(R.id.load_layout).setVisibility(View.GONE); this.addFooterView(footer); this.setOnScrollListener(this); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (totalItemCount == lastVisibleItem && scrollState == SCROLL_STATE_IDLE) { if (!isLoading) { isLoading = true; footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE); // 加载更多 iLoadListener.onLoad(); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.lastVisibleItem = firstVisibleItem + visibleItemCount; this.totalItemCount = totalItemCount; } /** * 加载完毕 */ public void loadComplete() { isLoading = false; footer.findViewById(R.id.load_layout).setVisibility(View.GONE); } public void setInterface(ILoadListener iLoadListener) { this.iLoadListener = iLoadListener; } /** * 加载更多数据的回调接口 */ public interface ILoadListener { public void onLoad(); } }