一、ListView:

1、 ListView通常有两个职责:

1、向布局填充数据

2、处理选择点击等操作

2、ListView的创建需要3个元素:

1、 ListView中的每一列的View。

2、 填入View的数据或者图片等。

3、连接数据与ListView的适配器

3、适配器:

①首先我们可以通过一张图来解释适配器的作用。

②适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,我们可以理解为适配器就是数据和视图之间的桥梁,通过转换方式将将复杂的数据转化为简单的View。简单来说就是一种转换方式将不能用的转换为可以用的。

常见的适配器:

4、SimpleAdapter与baseAdapter的区别:

它们两都是Android里的适配器,充当数据和界面之间的桥梁,用SimpleAdapter、baseAdapter的实现效果都几乎是一样,SimpleAdapter适配器使用的数据结构是HashMap,这意味着,如果需要操作的数据对象结构过于复杂时,需要写大量的相关转化代码,程序的效率和可维护性都会变的很低,但是它完全不用考虑缓存弄到应用程序卡死的问题,而且代码会与页面代码耦合,无法切换页面,反过来baseAdapter却是需要写清除缓存代码的,而且baseadapter代码会相对来说会简洁清晰页面与代码不会耦合,所以simpleadapter相对于这个Baseadapter来说呢,就有点太 多的限制。使baseadapter会让代码变得简捷效率更加灵活操作!(注:)

二、编写代码:

效果图:

1、结合上一章微信布局我们知道中间部分是用来动态添加数据的,根据上面这张图片我们知道需要一张图片和3个显示文字的控件和显示最右边的消息图标的控件。

2、所以我们又添加一个布局对中间部分进行布局,显示一项一项(item)的数据。

中间2: listviewitems

listviewitems.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:src="@drawable/tabbar_mainframe" /> <LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="vertical"
android:layout_margin="5dp"
>
<TextView android:id="@+id/tv_userName"
android:layout_width="match_parent"
android:layout_height="20dp"
/> <TextView
android:id="@+id/tv_lastMessage"
android:layout_width="match_parent"
android:layout_height="15dp"
/> </LinearLayout> <TextView
android:id="@+id/tv_datetime"
android:layout_width="150dp"
android:layout_height="15dp"
/>
<TextView
android:id="@+id/img"
android:layout_width="25dp"
android:gravity="center"
android:layout_height="25dp"
android:background="@drawable/tubiao"
/>
</LinearLayout>

1、我们通过ImageView设置左边图片。

2、通过2个TextView控件分别显示名字和内容,并且将这2个控件用LinearLaout布局一下。

3、添加2个TextView控件分别显示时间和图片,通过背景图片设置。

tubiao.xml文件:(设置圆形图标)

<?xml version="1.0" encoding="utf-8"?>

    <shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false" >
<solid android:color="#eee" />
<padding
android:left="2dp"
android:top="1dp"
android:right="2dp"
android:bottom="1dp" />
<solid
android:color="#FF0000" />
<stroke
android:width="1dp"
android:color="#ccc" />
<size android:width="60dp"
android:height="60dp" /> </shape>

通过shape类型布局设置圆形图标。

效果图片:

4、listView 添加数据(baseAdapter适配器

messages.java文件:

public class messages {

    private String tou1;

    private String userName;

    private String lastMessage;

    private String datetime;

    private int id;

    public String getTou1() {
return tou1;
}
public void setTou1(String tou1) {
this.tou1 = tou1;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLastMessage() {
return lastMessage;
}
public void setLastMessage(String lastMessage) {
this.lastMessage = lastMessage;
}
public String getDatetime() {
return datetime;
}
public void setDatetime(String datetime) {
this.datetime = datetime;
}
public int getIt() {
return id;
}
public void setIt(int id) {
this.id = id;
}
}

我们通过messages来定义一下要显示的字段。

MainActivity.java文件:

public class MainActivity extends Activity {

    private SimpleAdapter sa;
private ListView lv;
private List<messages> messageList = new ArrayList<messages>();
private List<Map<String,Object> > messageList2 = new ArrayList<Map<String,Object> >();
private List<messages> messageList3;//用于ORMLite 的演示 private DatabaseHelper db_helper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin);

for (int i = 1; i < 101; i++) {

//添加数据
                              messages m = new messages();
                              m.setTou1(""+i);
                              m.setUserName("TT"+i);
                              m.setLastMessage( "一起去旅游");
                              m.setDatetime("10月1日");
                               messageList.add(m);//上周

}

//简单理解为VC绑在一起

// baseAdapter
          lv = (ListView)findViewById(R.id.listView1);

            lv.setAdapter( new BaseAdapter(){
//返回多少条记录
@Override
public int getCount() {
// TODO Auto-generated method stub
return messageList.size();
}
//每一个item项,返回一次界面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
//布局不变,数据变 //如果缓存为空,我们生成新的布局作为1个item
if(convertView==null){
Log.i("info:", "没有缓存,重新生成"+position);
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
//因为getView()返回的对象,adapter会自动赋给ListView
view = inflater.inflate(R.layout.listview_item_layout, null);
}else{
Log.i("info:", "有缓存,不需要重新生成"+position);
view = convertView;
}
messages m = messageList.get(position);
TextView tv_userName = (TextView)view.findViewById(R.id.tv_userName);
tv_userName.setText( m.getUserName() );
tv_userName.setTextSize(15); TextView tv_lastMessage = (TextView)view.findViewById(R.id.tv_lastMessage);
tv_lastMessage.setText( m.getLastMessage() );
tv_lastMessage.setTextSize(12); TextView tv_datetime = (TextView)view.findViewById(R.id.tv_datetime);
tv_datetime.setText( m.getDatetime() );
tv_datetime.setTextSize(12); return view;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} } );
} }

1、定义一个List<messages>集合用来存储添加的数据。

2、通过ListView的setAdapter设置BaseAdapter显示的View。

3、通过相关的控件set属性设置值,通过get属性获取值。

4、通过View  getView()方法进行界面布局。

4、listView 添加数据(SimpleAdapter适配器

MainActivity.java文件:

public class MainActivity extends Activity {

    private SimpleAdapter sa;
private ListView lv;
private List<messages> messageList = new ArrayList<messages>();
private List<Map<String,Object> > messageList2 = new ArrayList<Map<String,Object> >();
private List<messages> messageList3;//用于ORMLite 的演示 private DatabaseHelper db_helper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin);

//模拟读取数据库或者互联网

for (int i = 0; i < messageList3.size(); i++) {
                    //定义一个界面与数据的混合体,一个item代表一行记录
                    Map<String,Object> item = new HashMap<String,Object>();
                    //一行记录,包含多个控件
                    item.put("tou", R.drawable.tou1);
                    item.put("userName", messageList3.get(i).getUserName()+i);
                    item.put("lastMessage", messageList3.get(i).getLastMessage());
                    item.put("datetime",messageList3.get(i).getDatetime());
                    messageList2.add(item);
                }


lv = (ListView)findViewById(R.id.listView1);
                  sa = new SimpleAdapter(this,
                  messageList2,//data 不仅仅是数据,而是一个与界面耦合的数据混合体
                  R.layout.listview_item_layout,
                  new String[] {"tou","userName","lastMessage","datetime"},//from 从来来
                  new int[] {R.id.imageView1,R.id.tv_userName,R.id.tv_lastMessage,R.id.tv_datetime}//to 到那里去
                  );
         lv.setAdapter(sa);
         lv.setOnItemClickListener(new OnItemClickListener() {


@Override
    public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
                      Map<String,Object> item = messageList2.get(position);
                      item.put("userName", "赵本山"+position);
                      sa.notifyDataSetChanged();
          }
      });

  }

            @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} } );
} }

Android之listview添加数据篇的更多相关文章

  1. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

  2. 【WinForm】线程中向listview添加数据

    在使用listview的时候,因为处理的数据较多,为防止在处理数据时出现假死的状态出现卡的情况,我们使用委托进行处理添加数据 定义委托 private delegate void AddListVie ...

  3. listview添加数据

    1. 添加数据: ListView1.ViewStyle:=vsReport; ListView1.Columns.Add; ListView1.Columns[0].Caption:='aaaa'; ...

  4. WPF - 多列ListView添加数据的多种方式

    多列ListView: <ListView x:Name="listView"> <ListView.View> <GridView> < ...

  5. android listview 添加数据

    <span style="white-space:pre"> </span>listView = (ListView) findViewById(R.id. ...

  6. Android在listview添加checkbox实现单选多选操作问题(转)

    转自:http://yangshen998.iteye.com/blog/1310183 在Android某些开发需求当中,有时候需要在listveiw中加入checkbox实现单选,多选操作.表面上 ...

  7. Android在listview添加checkbox实现单选多选操作问题

    android根据View的不同状态更换不同的背景http://www.eoeandroid.com/thread-198029-1-1.html android 模仿朋友网推出的菜单效果[改进版]h ...

  8. 完美解决Android在listview添加checkbox实现单选多选操作问题

    在Android某些开发需求当中,有时候需要在listveiw中加入checkbox实现单选,多选操作.表面上看上去只是改变checkbox那么简单,然而实际开发中,实现起来并不是那么得心应手.尤其当 ...

  9. Android在ListView滑动数据混乱

    我相信做过Android应用程序开发或多或少都遇到了这个问题.或者是在ListView数据损坏幻灯片事件.要么GridView数据损坏幻灯片事件. 让我们来看看一个网友写的文章,个人感觉还不错的文章: ...

随机推荐

  1. C++句柄解析

    C++句柄类解析 引题:在C++中,对于运行时类型识别问题.在程序中使用引用或者指针在运行时动态识别对象类型.然而使用指针或者引用却增加了用户负担(在继承体系中,没有明确的基类到派生类的转换,必须用户 ...

  2. JavaScript基础四

    1.13 Js中的面向对象 1.13.1 创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或 ...

  3. 第5天(半天)【shell编程初步、grep及正则表达式】

    第5天(半天)[shell编程初步.grep及正则表达式] shell编程初步(01)_recv shell脚本:文本文件 #!:/bin/bash #!:/usr/bin/python #!:/us ...

  4. arguments.callee弃用与webuploader

    使用最近使用ueditor的时候 谷歌浏览器下上传相同图片两次后第三次上传不了 而且取消了后会出现一个错误的图片.使用的ueditor是1.4.3 后来发现 这个是 webuploader插件的问题. ...

  5. Python connect mariadb(Python连接mysql)

    #!/usr/bin/python#coding=utf-8 import MySQLdb # 打开数据库连接db = MySQLdb.connect("192.168.1.250" ...

  6. ThinkPHP5模型操作中的自动时间戳总结

    ThinkPHP5中提供了非常优秀的自动时间戳功能.使用起来非常方便. 但是官网手册中的说明还是不是很详尽,因此整理再次,以方便后续使用时查阅. 一.一般情况下的自动填充create_time,upd ...

  7. linux c使用socket进行http 通信,并接收任意大小的http响应(三)

    使用socket进行http通信的时候,浏览器返回的响应经常不是固定长度的,有时候很大,有些时候又非常小,十分讨厌.如果仅仅只是为了接收一小段信息,设置一个十分大的缓存,这样又会十分浪费.而且经常更改 ...

  8. 关于规范NOIP试题管理办法的通知

    由CCF主办的NOIP赛事举行在即,保密起见,现将有关规定发给各省赛区组织单位. 1.NOI各省组织单位负责试题保密工作. 2.NOIP初赛试卷为纸质版,复赛试卷为电子版. 3.在初赛进行中,如有选手 ...

  9. Ubuntu18.04 搭建zookeeper单机版集群

    一台电脑启动三个虚拟机比较折腾,这里就用一台虚拟机模拟一下zk集群. 1.后台下载安装包到 /opt目录 sudo wget -b http://archive.apache.org/dist/zoo ...

  10. Centos7安装xenserver tools

    mount /dev/cdrom /mnt [root@192 ~]# mount /dev/cdrom /mntmount: /dev/sr0 写保护,将以只读方式挂载[root@192 ~]# c ...