安卓Listview和Adapter数据设计

安卓Listview和Adapter数据设计,第1张

概述ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会自动出现垂直滚动条,每一行是一个View对象,在每一行上可以放置任何组件,Adapter适配器是数据和UI的桥梁,为数据显示提供了统

ListVIEw是一种用于垂直显示的列表控件,如果显示内容过多,则会自动出现垂直滚动条,每一行是一个VIEw对象,在每一行上可以放置任何组件,Adapter适配器是数据和UI的桥梁,为数据显示提供了统一的封装。

 

常用的Adapter有:

ArrayAdapter<T>:用来绑定一个数组,支持泛型 *** 作,最为简单,只能展示一行字。

SimpleAdapter:用来绑定在布局xml中定义的控件对应的数据,有好的扩充性,可以自定义出各种效果

BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性

 

ArrayAdapter的使用:

      该类的构造方法为:public ArrayAdapter(Context context,int textVIEwResourceID,List<T> objects)其中参数1为上下文;参数2为布局文件,通常使用系统提供的单文字布局(androID.R.layout.simple_List_item_1);参数3为数据,通常为List集合或者数组。

1、简单的一个列表实现:

 

布局文件:

1 <ListVIEw2     androID:layout_wIDth="match_parent"3     androID:ID="@+ID/main_List"4     androID:layout_height="match_parent">5 </ListVIEw>

数据添加和适配:

 1      //新建一个List存放数据 2         List<String> Listdata=new ArrayList<String>(); 3         Listdata.add("东小东1"); 4         Listdata.add("东小东2" 5         Listdata.add("东小东3" 6         Listdata.add("叮叮当当" 7         Listdata.add("咚咚咚嘻嘻嘻" 8  9         列表10         main_List=(ListVIEw)findVIEwByID(R.ID.main_List);11         androID.R.layout.simple_List_item_1不可改成自定义布局文件12         final ArrayAdapter<String> adp2=new ArrayAdapter<String>(MainActivity.this,androID.R.layout.simple_List_item_1,Listdata);13         main_List.setAdapter(adp2);

ListvIEw的事件监听:

 1    点击事件 2         main_List.setonItemClickListener(new AdapterVIEw.OnItemClickListener() { 3             @OverrIDe 4             public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,1)">long ID) { 5  6                 Toast.makeText(MainActivity.this,"你点击了:"+position+"项 内容为:"+adp2.getItem(position),Toast.LENGTH_SHORT).show(); 7  8             } 9         });10 长按事件12         main_List.setonItemLongClickListener( AdapterVIEw.OnItemLongClickListener() {13 14             boolean onItemLongClick(AdapterVIEw<?> parent,1)">15 16                 Toast.makeText(MainActivity.17 18                 return true;19 20         });

2、下拉选择栏实现和输入匹配:

                             

 

 布局文件:

 1 <Spinner 2     androID:layout_wIDth="match_parent" 3     androID:layout_height="wrap_content" 4     androID:ID="@+ID/main_spinner" 5     > 6  7 </Spinner> 9  <!--completionThreshold="1" 表示从第一个字符开始匹配 -->10  <autoCompleteTextVIEw11 androID:ID="@+ID/main_autotv"12 androID:layout_wIDth="match_parent"13 androID:layout_height="wrap_content"14 androID:hint="在这里输入会自动提示"15 androID:completionThreshold="1" />16 17 <button18     androID:layout_wIDth="match_parent"19     androID:text="点.."20     androID:ID="@+ID/main_but"21     androID:layout_height="wrap_content" />22 23 <TextVIEw24     androID:layout_wIDth="wrap_content"25     androID:text="请点击按钮"26     androID:ID="@+ID/main_tv"27     androID:layout_gravity="center"28     androID:layout_height="wrap_content" />

简单逻辑实现:

 1 /配置一个公用的数组做测试 2  arrayadapter实现字符串适配 3  String[] str_arr={"东小东","东东","大东东","叮叮当当"}; 4  5  选择框 6  main_sp=(Spinner)findVIEwByID(R.ID.main_spinner); 7  ArrayAdapter<String> adp= adp.setDropDownVIEwResource(androID.R.layout.simple_spinner_dropdown_item); main_sp.setAdapter(adp);11  输入提示12  main_atv=(autoCompleteTextVIEw)findVIEwByID(R.ID.main_autotv);13  ArrayAdapter<String> adp2=14  main_atv.setAdapter(adp2);16 按钮监听,获取两个框的值17 findVIEwByID(R.ID.main_but).setonClickListener( VIEw.OnClickListener() {18     @OverrIDe19     voID onClick(VIEw v) {20         String strsp=main_sp.getSelectedItem().toString().trim();21         String stratv=main_atv.getText().toString().trim();22         main_tv.setText(strsp+"\n"+stratv);23 24 25     }26 });

SimpleAdapter的使用:

      该类的构造方法为:public SimpleAdapter(Context context,List<? Extends Map<String,?>> data,int resource,String[] from,int[] to)其中参数1为上下文;参数2为数据,一个Map的List,List里每一项都是map对象,一个map对象就表示ListvIEw中一行的内容;参数3为布布局资源,可以知己写也可以使用系统提供的;参数4为map里的键,其对应着参数5中布局资源的每一个显示控件ID。 

建立ListvIEw中每一个item的基本布局:

新建一个xml文件即可

主布局文件:

5 </ListVIEw>

数据设置和适配及ListvIEw事件监听:

 1 String str_con="一秒就成为了下一秒的过去,既然很多东西注定要失去的,那么,我们唯一可以做到的就是不轻易忘记。“读过一句话,当你总是缅怀过去的时候,证明你现在过的并不好。所以,美好的回忆可以,但绝不留恋。要永远憧憬,永远在现在努力。" 2  4 List<Map<String,Object>> Listdata=new ArrayList<Map<String,Object>> 6  第一行内容 7  Map<String,Object> mapdata=new HashMap<String,Object> 8  mapdata.put("img" 9  mapdata.put("Title","东小东1"10  mapdata.put("context","1: "+str_con);11  Listdata.add(mapdata);12 13  第二行内容14  mapdata=15  mapdata.put("img"16  mapdata.put("Title","东小东2"17  mapdata.put("context","2: "+19 20  第三行内容21  mapdata=22  mapdata.put("img"23  mapdata.put("Title","东小东3"24  mapdata.put("context","3: "+26 27 28  键和显示控件的ID必须一一对应29  String[] key_data={"img","Title","context"30  int[] res_data={R.ID.dong_img,R.ID.dong_Title,R.ID.dong_context};31 32  33  main_List=34  final SimpleAdapter adp2=new SimpleAdapter(MainActivity.35  main_List.setAdapter(adp2);36 37  38  main_List.setonItemLongClickListener(39      @OverrIDe40      41 42 方法1------------------------------43  Map<String,Object> mMap = (Map<String,Object>) adp2.getItem(position);44 45  得到标题46  String Title=mMap.get("Title").toString();47  得到内容48  String cont=mMap.get("context").toString();49 50  得到图片资源51  int img=(int)mMap.get("img");52 53 方法2-----------------------------54          HashMap<String,String> map=(HashMap<String,String>)parent.getItemAtposition(position);55          得到标题56          String Title=map.get("Title"57          得到内容58          String cont=map.get("context"59 60          Toast.makeText(MainActivity.cont,1)">61 62          63      }64  });

BaseAdapt使用:

    相比前面两个,其baseadapt使用较为复杂,但实现的功能较多,对复杂界面数据显示能力强,是学习ListvIEw数据适配的重点。baseadapt是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

 

建立ListvIEw中每一个item的基本布局:

新建一个xml文件即可

建立一个存放数据的类,并实现其Get和Set方法:

 1 class BaseData{ 2     分别为标题和内容 3     private String Title,text; 4     图片资源 5     private int img; 7     public String getTitle() { 8         return Title;11      setTitle(String Title) {this.Title =14 15      String getText() {16          text;17 18  setText(String text) {20         this.text =21 23      getimg() {24         27     voID setimg( img) {28         this.img =29 30 }

设置数据:

 3 List<BaseData> Listdatax=new ArrayList<> 4 BaseData bd= BaseData(); 5 bd.setimg(R.mipmap.zcy1); 6 bd.setTitle("东小东111" 7 bd.setText("111"+Listdatax.add(bd); 9 10 bd=bd.setimg(R.mipmap.zcy2);12 bd.setTitle("东小东222"13 bd.setText("222"+16 bd=bd.setimg(R.mipmap.zcy3);18 bd.setTitle("东小东333"19 bd.setText("333"+20 Listdatax.add(bd);

 vIEwholder缓存设计:

       通过VIEwHolder缓存convertVIEw,这种利用缓存contentVIEw的方式可以判断如果缓存中不存在VIEw才创建VIEw,如果已经存在可以利用缓存中的VIEw,提升了性能 。 VIEwHolder只是将需要缓存的那些vIEw封装好。

1 static   mVIEwHolder{2     TextVIEw htext,hTitle;3     ImageVIEw himg;4 5 }

适配器类:

适配器类class MyBaseAdapter extends BaseAdapter { 3  4         private List<BaseData> Listdatax2; 5         构造函数,获取到数据列表 6         public MyBaseAdapter(List<BaseData> datex){ 7             this.Listdatax2=datex;        }10         @OverrIDeint getCount() {总条数12              Listdatax2.size();15         public Object getItem(int position) {根据一个索引(位置)获得该位置的对象16              Listdatax2.get(position);19         long getItemID(获取条目的ID20             return 022 23         public VIEw getVIEw(获取该条目要显示的界面24             mVIEwHolder holder = null25 26             if (convertVIEw == ) {27                 无缓存时进入28                 holder =  mVIEwHolder();29                 这里要注意有一个是上下文,一个是显示每一行的行布局文件30                 convertVIEw=MainActivity.this.getLayoutInflater().inflate(R.layout.dong,parent,1)">false32                 holder.hTitle = (TextVIEw) convertVIEw.findVIEwByID(R.ID.dong_Title);33                 holder.htext= (TextVIEw) convertVIEw.findVIEwByID(R.ID.dong_context);34                 holder.himg = (ImageVIEw) convertVIEw.findVIEwByID(R.ID.dong_img);                convertVIEw.setTag(holder);36             }else {37                 缓存时进入38                 holder = (mVIEwHolder) convertVIEw.getTag();40             匹配数据41             holder.hTitle.setText(Listdatax2.get(position).getTitle());            holder.htext.setText(Listdatax2.get(position).getText());            holder.himg.setimageResource(Listdatax2.get(position).getimg());45       /*            lilayoutx.p1tx.setonClickListener(new VIEw.OnClickListener() {47                 @OverrIDe                public voID onClick(VIEw v) {49                     iteminterx.onclick(position);50                 }            });53             */54              convertVIEw;55 56     }

结果显示及事件监听:

新建适配器对象final MyBaseAdapter myadapterx= MyBaseAdapter(Listdatax); 3   4  main_List=设置适配器 6  main_List.setAdapter(myadapterx); 7 添加点击事件 8  main_List.setonItemClickListener(10      11          使用对象方法获取12          BaseData itemx;13          itemx = (BaseData) myadapterx.getItem(position);14          int img=itemx.getimg();16          可自接通过此处改变控件上的某个图片显示17          图片显示控件,main_img=(ImageVIEw)findVIEwByID(R.ID.main_img);         main_img.setimageResource(img);19           20          数据输出21          Toast.makeText(MainActivity. img,1)">23  });

 

 下一步将整理出基本的详细内容展示页编写和ListVIEw下拉刷新实现

 

总结

以上是内存溢出为你收集整理的安卓Listview和Adapter数据设计全部内容,希望文章能够帮你解决安卓Listview和Adapter数据设计所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1121213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存