整理一下Android中的ListView
16lz
2021-01-23
Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview的基础的用法。
一、最基本的绑定
java代码:
package com.tmnw;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity { /*----ListView MVC实现----*/ // model Listdata; // view ListView lv; // controller ArrayAdapter adapter; int size = 1; // 初始化组件 private void initWidget() { lv = (ListView) findViewById(R.id.list); } // 初始化绑定数据 private void initData() { if (lv == null) return; // 第一步:获取数据源(model) data = new ArrayList (); appendData(); // 第二步:new一个适配器(controller) // 参数1:Context // 参数2:listview的item布局 // 参数3:数据填充在item布局下的那个控件id // 参数4:填充的数据 adapter = new ArrayAdapter (this, R.layout.simple_text, R.id.text1, data); // 第三步:给listview设置适配器(view) lv.setAdapter(adapter); } // 添加数据 private void appendData() { if (data == null) return; for (int i = 0; i < 10; i++) { data.add("" + size++); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWidget(); initData(); }}
(吐槽一下为神马把我代码里的空行去掉了,感觉好难看)
xml代码:
activity_main.xml
simple_text.xml
<?xml version="1.0" encoding="utf-8"?>
画面效果:
二、给ListView添加头和尾部
java代码:
// 初始化组件 private void initWidget() { lv = (ListView) findViewById(R.id.list); header = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) header.findViewById(R.id.text1)).setText("这是一个头部"); footer = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) footer.findViewById(R.id.text1)).setText("加载中..."); }// 初始化绑定数据 private void initData() { if (lv == null) return; // 第一步:获取数据源(model) data = new ArrayList(); appendData(); // 第二步:new一个适配器(controller) // 参数1:Context // 参数2:listview的item布局 // 参数3:数据填充在item布局下的那个控件id // 参数4:填充的数据 adapter = new ArrayAdapter (this, R.layout.simple_text, R.id.text1, data); // 第三步:给listview设置适配器(view) // addHeaderView和addFooterView一定要有一个在setAdapter之前调用,或者2个都在setAdapter之前调用 lv.addHeaderView(header); lv.setAdapter(adapter); // 这里的参数null是数据,false说明是不能被选中的 lv.addFooterView(footer, null, false); // 设置尾部无分割线,头部不想要分割线同理 lv.setFooterDividersEnabled(false); }
(只贴了部分修改过的代码)
画面效果:
三、给ListView添加下滑加载中的一种实现方式
因为listview要滚动,所以给它添加滚动监听,为了书写简便,我让本Activity实现了OnScrollListener
public class MainActivity extends Activity implements OnScrollListener
java代码:
先增加几个变量
Button scrollInfo;Thread currentThread;
初始化组件代码修改下
lv = (ListView) findViewById(R.id.list); scrollInfo = (Button) findViewById(R.id.scroll_info); header = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) header.findViewById(R.id.text1)).setText("这是一个头部"); footer = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) footer.findViewById(R.id.text1)).setText("加载中...");
在onCreate中添加
lv.setOnScrollListener(this);
实现OnScrollListener方法:
@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 手指接触屏幕滑动 case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 手指离开屏幕做惯性滑动 case OnScrollListener.SCROLL_STATE_FLING: // 当滑动要最后一行时加载数据 if (view.getLastVisiblePosition() == view.getCount() - 1) { // 可以通过网络加载数据等。 // 判断是否还是在加载中 if (currentThread == null || !currentThread.isAlive()) { // 添加listview尾部控件加载中 lv.addFooterView(footer, null, false); // 启动线程加载数据 currentThread = new DataLoadThread(); currentThread.start(); } } break; // 不滑动 case OnScrollListener.SCROLL_STATE_IDLE: break; }}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // firstVisibleItem:第一个显示的item位置 // visibleItemCount:当前显示的item个数 // totalItemCount:listview的item总个数 scrollInfo.setText("first:" + firstVisibleItem + " visible:" + visibleItemCount + " total:" + totalItemCount);}
添加加载数据的线程
// 模拟加载数据 class DataLoadThread extends Thread { @Override public void run() { try { Thread.sleep(2000); appendData(); // 因为Android控件只能通过主线程(ui线程)更新,所以用此方法 runOnUiThread(new Runnable() { @Override public void run() { // 加载完毕,移除尾部控件 lv.removeFooterView(footer); // 当数据改变时调用此方法通知view更新 adapter.notifyDataSetChanged(); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }
画面效果:
四、给ListView添加item点击事件
为了书写简便,我让本Activity实现了OnItemClickListener
public class MainActivity extends Activity implements OnScrollListener, OnItemClickListener
java代码:
然后实现其方法
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText( this, "position:" + position + " item:" + parent.getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show(); }
给listview添加监听
lv.setOnItemClickListener(this);
画面效果:
(模拟器出问题了使用了真机调试,没想到图片这么大,不过比模拟器快多了)
五、自定义适配器的使用
java代码:
// 自定义基础适配器 class MyAdapter extends BaseAdapter { // listview显示的个数,如果有数据源有10条,而返回5,那么lv永远只能显示5条 // 所以最好就返回数据源的条数就好了 @Override public int getCount() { return data.size(); } // 获取item绑定的数据时调用 @Override public Object getItem(int position) { return data.get(position); } // itemId @Override public long getItemId(int position) { return position; } // lv显示几个item就会调用几次此方法,然后返回一个view对象显示 // position:位置 // convertView:如果lv不能显示全部的数据,那么滚动后会把从显示到不显示的View传进来复用 @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = getLayoutInflater().inflate(R.layout.simple_text, null); } else { view = convertView; } TextView tv = (TextView) view.findViewById(R.id.text1); tv.setText(data.get(position)); // 隔行变色,可以随心所欲 if ((position & 1) == 1) { tv.setBackgroundResource(android.R.color.holo_green_light); } else { tv.setBackgroundResource(android.R.color.holo_red_light); } return view; } }
然后修改一下setAdapter()
// adapter = new ArrayAdapter(this, R.layout.simple_text, // R.id.text1, data); adapter = new MyAdapter();
画面效果:
源 码
(基础的到此为止,又是一个鸡肉味的周末)
更多相关文章
- Android常用代码
- android 蓝牙打印程序源代码
- [Android]代码实现StateListDrawable
- Android仿计算器布局代码
- linux和windows平台下下载android sdk的源代码【Z】
- Android修改源代码控制不锁屏
- Android 入门第八讲02-WebView的高级用法(Android调用 JS 代码( lo
- Android 模拟器创建参数说明
- 在eclipse中查看android SDK的源代码