android--(布局ListView、优化、刷新分页、ArrayAdapter、SimpleAdapter 、BaseAdapter)
16lz
2021-01-26
ListView组件:
列表视图是Android 中最为常用的一种视图组件,它以垂直列表的方式列出
需要显示的列表项,例如:显示联系人名单、系统设置项等,都用到了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); //当单击item时的监听事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //获取点击的文本组件 TextView tv = (TextView) view; Toast.makeText(MainActivity.this,"view="+tv.getText().toString(),Toast.LENGTH_SHORT).show(); } }); }
列表数据资源文件:
arrays.xml:------------------------------------------------------------<?xml version="1.0" encoding="utf-8"?><resources> <array name="name"> <item>张建斌item> <item>冰冰item> <item>小李子item> <item>非非item> <item>张建斌item> <item>冰冰item> <item>小李子item> <item>非非item> array>resources>
//使用代码来实现listViewpublic class list2 extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//R.array.name:定义好的资源//利用系统的listView视图 ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(this, R.array.name,android.R.layout.simple_list_item_1); //设置视配器 setListAdapter(arrayAdapter); }//每一项的单击处理事件: @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Toast.makeText(this,((TextView)v).getText().toString(),Toast.LENGTH_SHORT).show(); }}
列表数据的单选和多选模式
public class list3 extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list3); listView = (ListView) findViewById(R.id.listView2);//资源xml String[] arr = getResources().getStringArray(R.array.name); //是单选模式 ArrayAdapter aa = new ArrayAdapter(this,android.R.layout.simple_list_item_single_choice,arr); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //多选模式 // ArrayAdapter aa1 = new ArrayAdapter(this,android.R.layout.simple_list_item_multiple_choice,arr); //listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(aa); }
ListView实现图文列表
1.创建两个activity一个主,另一个为item的布局例:item布局, "wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView_icon" android:src="@drawable/ic_launcher" /> "wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/textView_text" android:layout_marginLeft="60dp" /> 主: "wrap_content" android:layout_height="wrap_content" android:id="@+id/listView3" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_marginEnd="98dp" />2.在主activity中代码:public class list4 extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list4); listView = (ListView) findViewById(R.id.listView3); //准备数据,每个hashmap就是一条记录 HashMap title1 = new HashMap<>(); title1.put("title","title-1"); title1.put("icon",android.R.drawable.alert_light_frame); HashMap title2 = new HashMap<>(); title2.put("title","title-2"); title2.put("icon",android.R.drawable.arrow_up_float); HashMap title3 = new HashMap<>(); title3.put("title", "title-3"); title3.put("icon",android.R.drawable.btn_plus); ArrayList> list = new ArrayList<>(); list.add(title1); list.add(title2); list.add(title3);//this:上下文//list:数据//R.layout.activity_list4_item:布局文件//开始//结束 SimpleAdapter sa = new SimpleAdapter(this,list,R.layout.activity_list4_item,new String[]{"title","icon"},new int[]{R.id.textView_text,R.id.imageView_icon}); listView.setAdapter(sa); }
一个activity,还有一个item.xml//自定义的适配器实现public class list5 extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list5); listView = (ListView)findViewById(R.id.listView4); listView.setAdapter(new MyAdapter(this)); } static class MyAdapter extends BaseAdapter{ private Context context; public MyAdapter(Context context){ this.context= context; } private String[] titles = {"title1","title2","title3","title4"}; private int[] icons = {android.R.drawable.arrow_up_float, android.R.drawable.btn_default, android.R.drawable.btn_dialog, android.R.drawable.btn_radio}; @Override public int getCount() { return titles.length; } @Override public Object getItem(int position) { return titles[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); //实例化布局文件 View view = inflater.inflate(R.layout.activity_list4_item, null); TextView tv_title = (TextView) view.findViewById(R.id.textView_text); ImageView iv_icon = (ImageView) view.findViewById(R.id.imageView_icon); tv_title.setText(titles[position]); iv_icon.setImageResource(icons[position]); return view; } }优化:1.使用ListView的宽高固定,避免内容变化导致ListView重新渲染2.使用ConvertView 减少对象的创建3.使用ViewHolder减少对象的查找核心代码: @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHold vh; if(convertView == null){ LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.activity_list4_item, null); vh = new ViewHold(); vh.iv_icon = (ImageView)convertView.findViewById(R.id.imageView_icon); vh.tv_title = (TextView)convertView.findViewById(R.id.textView_text); //设置标志 convertView.setTag(vh); }else { vh = (ViewHold) convertView.getTag(); } vh.tv_title.setText(titles[position]); vh.iv_icon.setImageResource(icons[position]); return convertView; } //内部类:用于保存每一次查找的组件,避免下次重复查找 static class ViewHold{ ImageView iv_icon; TextView tv_title; } }
ListView刷新分页:1.当前Activity implements OnScrollLister2.实现接口方法3.listView注册滚动监听4.Adapter中添加数据的函数5.获得2页以后的数据后,,adpter增加数据,并刷新notifyDataSetChanged();public class list6 extends Activity implements AbsListView.OnScrollListener{ private Vector listNews = new Vector<>(); private ListView listView; private MyAdatper myAdatper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list6); listView = (ListView) findViewById(R.id.listView5); //注册滚动条事件 listView.setOnScrollListener(this); //实例化数据加载视图 View vi = getLayoutInflater().inflate(R.layout.loding, null); listView.addFooterView(vi); //初始化数据 initData(); //适配器 myAdatper = new MyAdatper(); listView.setAdapter(myAdatper); } //初始化数据 private int index = 1; private void initData(){ for(int i=0;i<24;i++){ News ns = new News(); ns.title = "title===="+index; ns.content = "content===="+index; index++; listNews.add(ns); } } //滚动状态改变 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //1.能显示的个数 等于滚动加载的个数 //2.滚动条停止 滚动 //myAdatper.getCount() 显示了多少条项 if(myAdatper.getCount() == vissibleLastIndex && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){ //开启线程 new loadDataThread().start(); } } private int vissibleLastIndex = 0;//用来可显示的最后一条数据索引值 //正在滚动的方法 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //firstVisibleItem :第个显示的项的画索引 //visibleItemCount:可以显示几项个数 // -1 :因为最后一个是加载项 vissibleLastIndex = firstVisibleItem+visibleItemCount-1; } private static final int DATA_UPDATE = 0X1;//数据更新完成后的标记; //线程之间通讯的机制 private Handler hander = new Handler(){ @Override public void handleMessage(Message msg) { //处理消息用的 switch (msg.what){ case DATA_UPDATE: myAdatper.notifyDataSetChanged();//视图更新通知 break; } } }; //子线程模拟加载效果 class loadDataThread extends Thread{ @Override public void run() { try { initData(); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //更新完数据,发一个标记 hander.sendEmptyMessage(DATA_UPDATE); } } //自定适配器 class MyAdatper extends BaseAdapter{ @Override public int getCount() { return listNews.size(); } @Override public Object getItem(int position) { return listNews.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView == null){ convertView = getLayoutInflater().inflate(R.layout.list6_item,null); vh = new ViewHolder(); vh.tv_title = (TextView) convertView.findViewById(R.id.title6); vh.tv_content = (TextView) convertView.findViewById(R.id.content6); convertView.setTag(vh); }else { vh = (ViewHolder) convertView.getTag(); } News ns = listNews.get(position); vh.tv_title.setText(ns.title); vh.tv_content.setText(ns.content); return convertView; } class ViewHolder{ TextView tv_title; TextView tv_content; } }}
更多相关文章
- Android基础知识】选项菜单、上下文菜单、子菜单的使用
- Android(安卓)面试
- android中fragment与activity之间通信原理以及例子
- 把android db文件导入到项目中
- Android(安卓)下拉列表框(spinner)
- Android(安卓)TextView实现显示时间变化
- Android中互联网的应用
- android存储方式(转)
- [置顶] Android大数据读取与折半查找(初步测试几毫秒)