精华内容
下载资源
问答
  • 列表控件

    2011-05-20 19:48:00
    列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create.创建一个窗口,dwStyle中可以使用以下一些...

    列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create.创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:
    LVS_ICON ,LVS_SMALLICON ,LVS_LIST, LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示

    LVS_EDITLABELS 结点的显示字符可以被,对于报表风格来讲可的只为第一列。

    LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点

    LVS_SINGLESEL 同时只能选中列表中一项

    首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:

    CImageList* SetImageList.

    如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:

    CImageList* SetImageList.

    int InsertItem.插入行

    nItem:指明插入位置

    lpszItem:为显示字符。

    除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列。

    int InsertColumn. 插入列iCol:为列的位置,从零开始lpszColumnHeading:为显示的列名nFormat:为显示对齐方式nWidth:为显示宽度nSubItem:为分配给该列的列索引。

    BOOL SetItemText.设置每列的显示字符

    nItem:为行位置

    nSubItem:为列位置

    lpszText:为显示字符

    下面的代码演示了如何设置多列并插入数据:

    m_list.SetImageList.//设置ImageList

    m_list.InsertColumn.//设置列

    m_list.InsertColumn.

    m_list.InsertColumn.

    m_list.InsertItem.//插入行

    m_list.SetItemText.//设置该行的不同列的显示字符

    m_list.SetItemText

    COLORREF GetTextColor/BOOL SetTextColor:用于得到/设置显示的字符颜色。

    COLORREF GetTextBkColor/BOOL SetTextBkColor:用于得到/设置显示的背景颜色。

    void SetItemCount:用于得到添加进列表中项的数量。

    BOOL DeleteItem:用于删除某一项

    BOOL DeleteAllItems:将删除所有项。

    BOOL SetBkImage:用于设置背景位图。

    CString GetItemText:用于得到某项的显示字符。

    列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY,wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList,其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为:

    LVN_BEGINLABELEDIT 在开始某项字符时发送,所用结构:

    NMLVDISPINFO

    LVN_ENDLABELEDIT 在结束某项字符时发送,所用结构:

    NMLVDISPINFO

    LVN_GETDISPINFO 在需要得到某项时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO

    关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。

    展开全文
  • 仿QQ好友列表控件(非控件拼凑)

    千次下载 热门讨论 2013-04-01 15:09:28
    仿QQ好友列表控件,使用代码绘制,无迟延无闪烁,非控件拼凑。
  • mfc 列表控件 显示文件列表
  • 第十九章 列表控件、树形控件、表格控件 19.1 列表控件QListWidget 19.2 树形控件QTreeWidget 19.3 表格控件QTableWidget 19.4 小结 列表控件可以让我们以列表形式呈现内容,是界面更加有序美观。QListWidget...

    第十九章 列表控件、树形控件、表格控件

    19.1 列表控件QListWidget

    19.2 树形控件QTreeWidget

    19.3 表格控件QTableWidget

    19.4 小结


    列表控件可以让我们以列表形式呈现内容,使界面更加有序美观。QListWidget列表控件应当与QListWidgetItem一起使用,后者作为项被添加入列表控件中,也就是说列表控件中的每一项都是一个QListWidgetItem。这也是为什么我们说QListWidget是一个基于项(Item-based)的控件了。

     

    同样基于项的控件还有QTreeWidget树形控件和QTableWidget表格控件,前者以树状方式呈现内容,并与QTreeWidgetItem搭配使用;后者以表格形式呈现内容,并与QTableWidgetItem一起使用。

     

    19.1 列表控件QListWidget

    笔者曾经做了一个可以方便生成报价表的桌面小程序,截图如下:

    程序中就用到了QListWidget,当选择一种产品系列后,左边的列表空间就会显示该系列的所有内容,然后双击其中的某项就可以在右边的列表控件中显示所双击的项:

    我们就通过实现这个简单的功能来学习下QListWidget。

    import sys
    from PyQt5.QtGui import QPixmap
    from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QListWidget, QListWidgetItem, QHBoxLayout
    
    
    class Demo(QWidget):
        def __init__(self):
            super(Demo, self).__init__()
            self.pic_label = QLabel(self)                       # 1
            self.pic_label.setPixmap(QPixmap('arrow.png'))
    
            self.listwidget_1 = QListWidget(self)               # 2
            self.listwidget_2 = QListWidget(self) 
            self.listwidget_1.doubleClicked.connect(lambda: self.change_func(self.listwidget_1))
            self.listwidget_2.doubleClicked.connect(lambda: self.change_func(self.listwidget_2))
    
            for i in range(6):                                  # 3
                text = 'Item {}'.format(i)
                self.item = QListWidgetItem(text)
                self.listwidget_1.addItem(self.item)
    
            self.item_6 = QListWidgetItem('Item 6', self.listwidget_1)  # 4
    
            self.listwidget_1.addItem('Item 7')                         # 5
            str_list = ['Item 9', 'Item 10']
            self.listwidget_1.addItems(str_list)
    
            self.item_8 = QListWidgetItem('Item 8')                     # 6
            self.listwidget_1.insertItem(8, self.item_8)
            # self.listwidget_1.insertItem(8, 'Item 8')
    
            self.h_layout = QHBoxLayout()
            self.h_layout.addWidget(self.listwidget_1)
            self.h_layout.addWidget(self.pic_label)
            self.h_layout.addWidget(self.listwidget_2)
            self.setLayout(self.h_layout)
    
        def change_func(self, listwidget):                              # 7
            if listwidget == self.listwidget_1:
                item = QListWidgetItem(self.listwidget_1.currentItem())
                self.listwidget_2.addItem(item)
                print(self.listwidget_2.count())
            else:
                self.listwidget_2.takeItem(self.listwidget_2.currentRow())
                print(self.listwidget_2.count())
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        demo = Demo()
        demo.show()
        sys.exit(app.exec_())

    1. pic_label用于显示图片;

    2. 实例化两个QListWidget,listwidget_1放在左边用于显示可选的内容,listwidget_2放在右边用于显示被双击的项。然后将这两个QListWidget控件的doubleClicked信号和自定义的槽函数连接起来,每当双击QListWidget中的某项时,就会触发该槽函数。

    3. 循环创建六个QListWidgetItem,并通过调用addItem(QListWidgetItem)将其添加到listwidget_1中;

    4. 当然也可以通过实例化时直接指定父类的方式进行添加;

    5. 也可以不用QListWidgetItem,直接调用addItem(str)方法来添加一项内容。也可以使用addItem(Iterable)来添加一组项内容(不过若要让项呈现更多功能的话,还是应该选择QListWidgetItem);

    6. 通过insertItem(row, QListWidgetItem)方法可以在指定行中加入一项内容;

    7. 接下来我们讲一下槽函数:

    def change_func(self, listwidget):
        if listwidget == self.listwidget_1:
            item = QListWidgetItem(self.listwidget_1.currentItem())
            self.listwidget_2.addItem(item)
            print(self.listwidget_2.count())
        else:
            self.listwidget_2.takeItem(self.listwidget_2.currentRow())
            print(self.listwidget_2.count())

    在槽函数中,我们判断信号是哪一个QListWidget发出的,如果是listwidget_1的话,我们先通过currentItem()获取到当前被双击的项,之后实例化为QListWidgetItem,再通过addItem(QListWidgetItem)方法加入listwidget_2中,count()方法用于获取项数量,这里我们打印出listwidget_2中一共有多少项内容。若信号是listwidget_2发出的话,则将当前被双击项的行数传给takeItem(int)方法来进行删除,然后也打印下项数量。

     

    bug report:currentItem()的返回值是QListWidgetItem,照理来说应该是可以直接被添加的,也就是说下方这种写法应该也是可以的,但是却没有用:

    self.listwidget_2.addItem(self.listwidget_1.currentItem())

     

    图片下载地址:

    arrow.png: https://www.easyicon.net/download/png/3980/64/

     

    运行截图如下,双击左边的某项,会发现右边的列表控件会显示出来:

    双击右边的某项将其删除:

     

    19.2 树形控件QTreeWidget

    通常我们用QTreeWIdget来显示文件目录结构,比如下图:

    但这里我们将用QTreeWidget实现在第七章讲解QCheckBox按钮时展示的安装程序树状结构:

    我们取以下部分进行说明并实现:

    可以看出根节点为Preview,其子节点为Qt5.11.2 snapshot,它一共有三种状态:全选中、无选中和半选中。而该子节点下面又有macOS、Android x86、Android ARMv7、Sources和iOS子节点。

    下面开始实现,请看代码:

    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QLabel, QHBoxLayout
    
    
    class Demo(QWidget):
        def __init__(self):
            super(Demo, self).__init__()
            self.resize(500, 300)
            self.label = QLabel('No Click')                         # 1
    
            self.tree = QTreeWidget(self)                           # 2
            self.tree.setColumnCount(2)
            self.tree.setHeaderLabels(['Install Components', 'Test'])
            self.tree.itemClicked.connect(self.change_func)
    
            self.preview = QTreeWidgetItem(self.tree)               # 3
            self.preview.setText(0, 'Preview')
    
            # self.preview = QTreeWidgetItem()
            # self.preview.setText(0, 'Preview')
            # self.tree.addTopLevelItem(self.preview)
    
            self.qt5112 = QTreeWidgetItem()                         # 4
            self.qt5112.setText(0, 'Qt 5.11.2 snapshot')
            self.qt5112.setCheckState(0, Qt.Unchecked)
            self.preview.addChild(self.qt5112)
    
            choice_list = ['macOS', 'Android x86', 'Android ARMv7', 'Sources', 'iOS']
            self.item_list = []
            for i, c in enumerate(choice_list):                     # 5
                item = QTreeWidgetItem(self.qt5112)
                item.setText(0, c)
                item.setCheckState(0, Qt.Unchecked)
                self.item_list.append(item)
    
            self.test_item = QTreeWidgetItem(self.qt5112)           # 6
            self.test_item.setText(0, 'test1')
            self.test_item.setText(1, 'test2')
    
            self.tree.expandAll()                                   # 7
    
            self.h_layout = QHBoxLayout()
            self.h_layout.addWidget(self.tree)
            self.h_layout.addWidget(self.label)
            self.setLayout(self.h_layout)
    
        def change_func(self, item, column):
            self.label.setText(item.text(column))                   # 8
    
            print(item.text(column))
            print(column)
            if item == self.qt5112:                                 # 9
                if self.qt5112.checkState(0) == Qt.Checked:
                    [x.setCheckState(0, Qt.Checked) for x in self.item_list]
                else:
                    [x.setCheckState(0, Qt.Unchecked) for x in self.item_list]
            else:                                                   # 10
                check_count = 0
                for x in self.item_list:
                    if x.checkState(0) == Qt.Checked:
                        check_count += 1
    
                if check_count == 5:
                    self.qt5112.setCheckState(0, Qt.Checked)
                elif 0 < check_count < 5:
                    self.qt5112.setCheckState(0, Qt.PartiallyChecked)
                else:
                    self.qt5112.setCheckState(0, Qt.Unchecked)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        demo = Demo()
        demo.show()
        sys.exit(app.exec_())

    1. QLabel控件用于显示每个QTreeWidgetItem的文本;

    2. 实例化一个QTreeWidget,通过setColumnCount(int)将该树状控件的列数设为2(默认为1列)。通过setHeaderLabels(Iterable)设置每列的标题,如果只有一列的话,则应该通过setHeaderLabel(str)方法设置。接着我们将itemClicked信号与自定义的槽函数连接起来,每当点击QTreeWidget中的任意一项时,都会触发itemClicked信号。QtAssistant中对该信号的说明如下:

    我们发现这是一个带参数的信号,而文档中解释说:每当一项内容被点击时,参数item就是被点击的项,参数column就是被点击项所在的列。也就是说当该信号被触发时,参数item保存被点击的项,column保存列数,而这两个参数会自动传给我们的槽函数。为与之对应,我们的槽函数也带了两个参数,这样我们就可以知道被点击的项和列数了。

    3. 实例化一个QTreeWidgetItem,并将其父类设为self.tree,表示self.preview为最外层(最顶层)的项,接着通过setText(int, str)方法来设置文本,第一个int类型参数为该文本所在的列,0表示放在第一列。当然我们也可以在实例化时不指定父类,并让self.tree调用addTopLevelItem()方法来设置最顶层的项;

    4. setCheckState(int, CheckState)方法可以让该项以复选框形式呈现出来,addChild(QTreeWidgetItem)方法可以添加子项,这里让self.preview添加一个self.qt5112选项;

    5. 实例化5个子项,将他们添加到self.qt5112中,并以复选框形式显示;

    6. 这里的self.test项只是拿来作为对比,好让读者知道将QTreeWidget设为两列时的样子;

    7. 调用expandAll()方法可以让QTreeWidget所有的项都是以打开状态显示的。注意必须要在所有项都已经实例化好之后再调用该方法,如果一开始就调用则会没有效果;

    8. 在槽函数中,self.label显示对应的项文本,item就是被点击的项,我们调用text(int)传入列数,获得文本(该text()函数用法跟我们之前使用的有所不同)。

    9. 如果被点击的项为qt5112,则我们判断是否其被选中,若是的话,将它的所有子项都设为选中状态,若为无选中状态的话,则将其子项全部设为无选中状态;

    10. 若被点击是qt5112的子项时,我们判断有多少个子项已经被选中了,若数量为5,则设置qt5112为选中状态,若为0-5之间,则设为半选中状态,若等于0,则设为无选中状态。

     

    运行截图如下:

     

    19.3 表格控件QTableWidget

    核心都是类似的,搭配QTableWidgetItem使用,下面就来讲一下常用的方法:

    import sys
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
    
    
    class Demo(QTableWidget):                               # 1
        def __init__(self):
            super(Demo, self).__init__()
            self.setRowCount(6)                             # 2
            self.setColumnCount(6)
            # self.table = QTableWidget(6, 6, self)
    
            print(self.rowCount())                          # 3
            print(self.columnCount())
    
            self.setColumnWidth(0, 30)                      # 4
            self.setRowHeight(0, 30)
    
            self.setHorizontalHeaderLabels(['h1', 'h2', 'h3', 'h4', ' h5', 'h6'])   # 5
            self.setVerticalHeaderLabels(['t1', 't2', 't3', 't4', 't5', 't6'])
    
            # self.setShowGrid(False)                       # 6
    
            self.item_1 = QTableWidgetItem('Hi')            # 7
            self.setItem(0, 0, self.item_1)
    
            self.item_2 = QTableWidgetItem('Bye')           # 8
            self.item_2.setTextAlignment(Qt.AlignCenter)
            self.setItem(2, 2, self.item_2)
    
            self.setSpan(2, 2, 2, 2)                        # 9
    
            print(self.findItems('Hi', Qt.MatchExactly))    # 10
            print(self.findItems('B', Qt.MatchContains))
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        demo = Demo()
        demo.show()
        sys.exit(app.exec_())

    1. 这里我们直接继承QTableWidget来实现程序;

    2. setRowCount(int)设置表格的行数,setColumnCount(int)设置列数。或者可以选择在实例化的时候直接指定行列数;

    3. rowCount()获取行数,columnCount()获取列数;

    4. setColumnWidth(int, int)设置列款,第一个参数填列序号,第二个参数填宽度值。setRowCount(int, int)设置行宽,参数同理;

    5. setHorizontalHeaderLabels(iterable)设置行的标题,而setVerticalHeaderLabels设置列的标题;

    6. setShowGird(bool)设置是否显示表格上的网格线,True为显示,False不显示;

    7. 实例化一个单元格,并用setItem(int, int, QTableWidgetItem)将该单元格添加到表格中。前两个int类型参数分别为行序号和列序号;

    8. setTextAlignment()设置单元格的文本对齐方式,QtAssistant中输入Qt::Alignment就可以找到各种对齐方式:

    9. setSpan(int, int, int, int)方法用来合并单元格,前两个int参数分别为行序号和列序号,后两个分别为要合并的行数和列数;

    10. findItems(str, Qt.MatchFlag)方法用来进行查找,前一个参数为用来匹配的字符串,后一个参数为匹配方式。在代码中我们用了两种匹配方式,第一种为Qt.MatchExactly,表示精确匹配。第二种为Qt.MatchContains,表示包含匹配。在QtAssistant中输出Qt::MatchFlag即可了解各种匹配方式:

     

    运行截图如下:

     

    若要更加个性化地控制界面,请大家阅读:《PyQt5高级编程实战》学会使用视图委托

     

    19.4 小结

     1. 列表控件QListWidget,树状控件QTreeWidget以及表格控件QTableWidget这三种控件都是基于项(item-based)的控件,应搭配QListWidgetItem,QTreeWidgetItem和QTableWidgetItem使用;

    2. 多使用文档。

     

    欢迎关注我的微信公众号,发现更多有趣内容:

    展开全文
  • MFC基本控件使用——列表控件(ListCtrl)

    万次阅读 多人点赞 2018-09-30 01:23:46
    咳咳,花了2天的时间,好好的把列表控件ListCtrl的基本使用研究了下。ListCtrl一共有4种样式:小图标、大图标、列表和报告。 其实呢,列表控件我们再熟悉不过了,因为当你随便打开一个文件夹的时候,显示的就是一个...

    咳咳,花了2天的时间,好好的把列表控件ListCtrl的基本使用研究了下。ListCtrl一共有4种样式:小图标、大图标、列表和报告。

    其实呢,列表控件我们再熟悉不过了,因为当你随便打开一个文件夹的时候,显示的就是一个列表控件。不相信?那可以试着修改下查看方式,在查看方式中有小图标、大图标、列表和详细信息,分别对应的就是以上的4种样式。所以啊,列表控件使用到的地方其实是很多的。不过,我们在写程序的时候用到的最多的是report这种样式,也就是用来显示大量的数据用的。因此,在这篇文章里,主要就是介绍report样式的使用,前面的3种就不讲了。
    1.首先说说ListCtrl最简单的使用,也就是数据的插入、删除等
    先在XXXDlg.h头文件中为列表控件添加一个Control类型的变量
     CListCtrl m_list1;
    再在XXXDlg.cpp源文件中的OnInitDialog()函数中给m_list1设定一些信息

     

    
     

    // ListCtrl1

    m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 整行选择、网格线

    m_list1.InsertColumn(0, _T(""), LVCFMT_LEFT, 0);

    m_list1.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 100); // 插入第2列的列名

    m_list1.InsertColumn(2, _T("年龄"), LVCFMT_LEFT, 100); // 插入第3列的列名

    m_list1.InsertColumn(3, _T("性别"), LVCFMT_LEFT, 100); // 插入第4列的列名

     

    for(int i = 0;i <= 7;i++) {

    strName.Format(_T("小石头%d"), i);

    strAge.Format(_T("%d"), 20 + i);

    strSex = i % 2 ? _T("男") : _T("女");

    m_list1.InsertItem(i, _T("")); // 插入行

    m_list1.SetItemText(i, 1, strName); // 设置第2列(姓名)

    m_list1.SetItemText(i, 2, strAge); // 设置第3列(年龄)

    m_list1.SetItemText(i, 3, strSex); // 设置第4列(性别)

    }

    这里牵涉到几个函数SetExtendedStyle()、InsertColumn()、InsertItem()、SetItemText()。下面一一介绍

     

    (1)SetExtendedStyle()  设置列表控件的扩展样式

    这里介绍几个常用的扩展样式:

     

    
     
    1. LVS_EX_CHECKBOXES每一行的最前面带个复选框

    2. LVS_EX_FULLROWSELECT整行选中

    3. LVS_EX_GRIDLINES网格线

    4. LVS_EX_HEADERDRAGDROP列表头可以拖动

    给个MSDN的地址,里面有更多的样式:http://msdn.microsoft.com/zh-cn/library/bb774732.aspx

    (2)InsertColumn()  插入1列

    int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 )

    
     
    1. nCol 第几列

    2. lpszColumnHeading 列名

    3. nFormat 对齐的方式,有3种:LVCFMT_LEFT(左对齐)、LVCFMT_CENTER(居中)、LVCFMT_RIGHT(右对齐)

    4. nWidth 这1列的宽度

    5. nSubItem 子项的索引与列(一般缺省默认即可,不用填)

    (3)InsertItem()  插入一行

    int InsertItem(const LVITEM* pItem);//  可以插入图片(但是失败了,图片没能显示,所以这里不介绍尴尬)

    int InsertItem(int nItem, LPCTSTR lpszItem) //  只能插入文字

    
     
    1. nItem 第几行

    2. lpszItem 这一行第1列的文字

    (4)SetItemText()  设置文字

    BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);

    
     
    1. nItem 列表中的第几行

    2. nSubItem 列表中的低级列

    3. lpszText 要显示的文字数据

    效果图:

    到这里,最基本的操作就说完了。不过,这里面有一个小细节的地方。如果仔细看代码会发现,我把列表的第一列的宽度设置成了0,而SetItemText()的时候,第1列的数据也是没有插入。这是因为:列表控件的第一列好像是叫虚列,当大数据的时候好像能够利用这个加快速度什么的,具体我也不是很清楚。但就是因为这个原因,我们会发现,第一列无法设置里面的文本居中对齐!!!即使设置成居中,仍然是左对齐的效果(大家可以试试)。所以,为了能够居中的显示,我这里就放弃了第一列。不过,如果是要显示图片的,或者是有CheckBox的列表,一定要有这个虚列,不然图片和CheckBox就无法显示了。如果仅仅是简单的文字,倒是可以这样达到第一列居中的效果。

    2.接着,再来说说列表控件中CheckBox的使用

    同样的,和1基本一样,就是在设置扩展样式中多了一个LVS_EX_CHECKBOXES

    
     

    // ListCtrl2

    m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES);

    m_list2.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);

    m_list2.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100);

    m_list2.InsertColumn(2, _T("性别"), LVCFMT_LEFT, 100);

     

    for(int i = 0;i <= 7;i++) {

    strName.Format(_T("小石头%d"), i);

    strAge.Format(_T("%d"), 20 + i);

    strSex = i % 2 ? _T("男") : _T("女");

    m_list2.InsertItem(i, _T(""));

    m_list2.SetItemText(i, 0, strName);

    m_list2.SetItemText(i, 1, strAge);

    m_list2.SetItemText(i, 2, strSex);

    }

    那么怎么获取打了勾的行呢?这里我加了2个单选框:全选 和 反选

    给全选单选框添加单击事件

    
     

     

    void CXXXDlg::OnBnClickedRadioAllSelect()

    {

    for(int i = 0;i < m_list2.GetItemCount();i++) {

    m_list2.SetCheck(i, TRUE);

    m_list2.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

    }

    }

    给反选单选框添加单击事件
    
     

    void CXXXDlg::OnBnClickedRadioInvertSelect()

    {

    BOOL state;

    for(int i = 0;i < m_list2.GetItemCount();i++) {

    state = m_list2.GetCheck(i);

    if(state == FALSE) {

    m_list2.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);

    m_list2.SetCheck(i, TRUE);

    }

    else {

    m_list2.SetItemState(i, ~LVIS_SELECTED, LVIS_SELECTED);

    m_list2.SetCheck(i, FALSE);

    }

    }

    }

    这里又牵涉到几个函数GetCheck()、SetCheck()、GetItemState()、SetItemState()。

    顾名思义,这几个函数的意思分别就是:获取和设置复选框的状态(打钩否)、获取和设置某一行的状态(选中否)。用法比较简单,看上面的例子就肯定知道了。

    效果图:

    3.最后,再介绍一下自绘ListCtrl

    因为列表控件选中某一行的时候,高亮的颜色是蓝色,这点本人不是很喜欢。因为以前想做个类似QQ一样的好友列表的,一开始选的是用ListCtrl来显示(对好友不分类的情况下),但是选中某一行的颜色是蓝色太难看,所以也就放弃了。这次,决心要好好研究一下,所以在网上找了许多资料都是介绍怎么重绘的。后来在网上找到一个现成的CMyListCtrl的类,里面说是能设置奇行、偶行、热点行、选中的背景和文字的颜色。但是唯独选中行的颜色有点BUG,无法实现修改颜色。在多次尝试之后,终于发现BUG所在。修改过的代码:

    
     

    void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

    {

    LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);

    int itemIndex = pNMCD->nmcd.dwItemSpec;

     

    if (pNMCD->nmcd.dwDrawStage == CDDS_PREPAINT) {

    *pResult = CDRF_NOTIFYITEMDRAW;

    }

    else if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {

    // 选中行(鼠标选中的行)

    if(GetItemState(itemIndex,LVIS_SELECTED) == LVIS_SELECTED) {

    pNMCD->nmcd.uItemState = ~CDIS_SELECTED;

    pNMCD->clrTextBk = m_selectItemBkColor;

    pNMCD->clrText = pNMCD->clrFace = m_selectItemTextColor;

    }

    // CheckBox打钩行

    else if(GetCheck(itemIndex) && (GetExtendedStyle() & LVS_EX_CHECKBOXES)) {

    pNMCD->clrTextBk = m_selectItemBkColor;

    pNMCD->clrText = m_selectItemTextColor;

    }

    // 热点行(鼠标停在上方)

    else if(itemIndex==m_hoverIndex) {

    pNMCD->clrTextBk = m_hoverItemBkColor;

    pNMCD->clrText = m_hoverItemTextColor;

    }

    // 偶数行(比如 0、2、4、6)

    else if(itemIndex % 2==0){

    pNMCD->clrTextBk=m_evenItemBkColor;

    pNMCD->clrText=m_evenItemTextColor;

    }

    // 奇数行(比如 1、3、5、7)

    else{

    pNMCD->clrTextBk = m_oddItemBkColor;

    pNMCD->clrText = m_oddItemTextColor;

    }

    *pResult = CDRF_NEWFONT;

    }

    }

    在这里,我在这个基础上,写了一个CListCtrlEx类,修改和加入了其他的一些功能,可以支持:

     

    (1)奇数行背景颜色(默认白色)

    (2)偶数行背景颜色(默认白色)

    (3)热点行背景颜色(默认白色)

    (4)选中行背景颜色(默认蓝色)

    (5)奇数行文本颜色(默认黑色)

    (6)偶数行文本颜色(默认黑色)

    (7)热点行文本颜色(默认黑色)

    (8)选中行文本颜色(默认黑色)

    (9)点击列表头,对列表内的数据进行升序/降序排列

    (10)双缓冲,解决了闪烁的问题

    传1张简单的效果图:

    https://img-my.csdn.net/uploads/201405/03/1399120330_1102.gif

    CListCtrlEx类下载地址:

    http://download.csdn.net/detail/smallstonesk/7288307

    --------------------- 本文来自 SmallStoneSK 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/smallstonesk/article/details/24931273?utm_source=copy

    展开全文
  • ExpandableListView 展开列表控件

    热门讨论 2012-03-09 16:06:19
    ExpandableListView 展开列表控件 教程请看 http://blog.csdn.net/knowheart/article/details/7002079
  • Android控件详解之列表控件

    千次阅读 2015-08-08 14:29:02
    我将Android控件的列表控件的学习知识总结一下和大家共享包括(ListView、ExpandableListView、Spinner) 在Android开发中,罗列信息或者整理信息就是需要用到进度控件,Android源生提供了ListView、...

    我将Android控件的列表控件的学习知识总结一下和大家共享包括(ListView、ExpandableListView、Spinner)

    在Android开发中,罗列信息或者整理信息就是需要用到进度控件,Android源生提供了ListView、ExpandableListView、Spinner这三种列表控件。

    其中Spinner就是相当于windows上经常看到的下拉框。

    1、ListView控件

    (1)普通列表控件

    ListView控件用于列表的形式显示数据。ListView控件采用MVC模式将前端显示与后端数据进行分离,也就是说,ListView控件在装载数据时并不是直接使用ListView.add或者类是的方法添加数据,而是需要指定一个Adapter对象,该对象就相当于MVC模式中的C(控制器,controller).ListView相当与MVC模式的V(视图,V),用于显示数据。为ListView提供数据的list、数组或数据库相当于MVC模式的M(模型、model)。

    在ListView控件中通过Adapter对象获得需要显示的数据。在创建Adapter对象需要指定要显示的数据,因此,要显示的数据与ListView之间通过Adapter对象进行连接,同时,又互相独立。也就是说,ListView只知道显示的数据来自Adapter,并不知道这些数据是来自list、数据或者数据库。对于数据来说,只知道将数据添加到Adapter中,并不知道这些数据会被用于ListView或者其他控件。

    ListView的属性:

    1. 背景色:

    listView设置背景色android:background="@drawable/bg",拖动或者点击list空白位置的时候发现ListItem都变成黑色。 因为默认的ListItem背景是透明的,而ListView的背景是固定不变的,所以在滚动条滚动的过程中如果实时地去将当前每个Item的显示内容跟背景进行混合运算,所以android系统为了优化这个过程用,就使用了一个叫做android:cacheColorHint的属性,在黑色主题下默认的颜色值是#191919,所以就出现了刚才的画面,有一半是黑色的。

    如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色;如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了,当然为了美化是要牺牲一些效率的。

    2. android:fadingEdge="none" 去掉上边和下边黑色的阴影

    3. android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一个图片资源lsitview的每一项之间需要设置一个图片做为间隔

    设置Item之间无间隙

    android:divider="#00000000" 或者在javaCode中如下定义:listView.setDividerHeight(0);

    4. android:listSelector="@color/pink" listView item 选中时的颜色。默认为橙黄底色。

    5. android:divider="@drawable/list_driver" 设置分割线的图片资源,如果则只要设置为

    android:divider="@drawable/@null" 不想显示分割线

     

    6. android:scrollbars="none" setVerticalScrollBarEnabled(true); 隐藏listView的滚动条

    7. android:fadeScrollbars="true" 设置为true就可以实现滚动条的自动隐藏和显示

    8. android:transcriptMode="alwaysScroll" 用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。

    android:fastScrollEnabled="false"
    android:fastScrollEnabled = "true" 加快滑动速度、滚动滑杆(至少要有4个滚动页)

    android:drawSelectorOnTop="false" 
    android:scrollingCache="false" 

    android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

    android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的

    When set to true, the selector will be drawn over the selected item. Otherwise the selector is drawn behind the selected item. The default value is false.

    9.在ListView中添加属性:
    android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track" android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
    scrollbar_vertical_track,crollbar_vertical_thumb自定义的xml文件,放在Drawable中,track是指长条,thumb是指短条,然后再xml中定义短条和长条的样式



    下面一个例子:

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<ListView android:id="@+id/lvCommonListView"
    		android:layout_width="fill_parent" android:layout_height="wrap_content" 
    		android:fastScrollEnabled="true"
    		/>
    </LinearLayout>
    

    Main.java:

    public class Main extends Activity implements OnItemSelectedListener,
    		OnItemClickListener
    {
    	private static String[] data = new String[]
    	{
    			"天地逃生",
    			"保持通话",
    			"乱世佳人(飘)",
    			"怪侠一枝梅",
    			"第五空间",
    			"孔雀翎",
    			"变形金刚3(真人版)",
    			"星际传奇"
    			 };
    
    	@Override
    	public void onItemClick(AdapterView<?> parent, View view, int position,
    			long id)                       //列表项被点击触发
    	{
    		Log.d("itemclick", "click " + position + " item");
    	}
    
    	@Override
    	public void onItemSelected(AdapterView<?> parent, View view, int position,
    			long id)                         //用于监听列表项被选中触发
    	{
    		Log.d("itemselected", "select " + position + " item");
    	}
    
    	@Override
    	public void onNothingSelected(AdapterView<?> parent)
    	{
    		Log.d("nothingselected", "nothing selected");
    	}
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		ListView lvCommonListView = (ListView) findViewById(R.id.lvCommonListView);
    		ArrayAdapter<String> aaData = new ArrayAdapter<String>(this,
    				android.R.layout.simple_list_item_1, data);              //后两个参数分别指定布局资源和数据
    		lvCommonListView.setAdapter(aaData);        
    		lvCommonListView.setOnItemClickListener(this);
    		lvCommonListView.setOnItemSelectedListener(this);
    	}
    }
    

    ListActivity.java:

    public class ListViewActivity extends Activity
    {
    	private String[] items =
    	{ "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance",
    			"Ackawi", "Acorn", "Adelost", "Affidelice au Chablis",
    			"Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
    			"Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
    			"Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh",
    			"Anthoriro", "Appenzell", "Aragon", "Ardi Gasna", "Ardrahan",
    			"Armenian String", "Aromes au Gene de Marc", "Asadero", "Asiago",
    			"Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss", "Babybel",
    			"Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal",
    			"Banon", "Barry's Bay Cheddar", "Basing", "Basket Cheese",
    			"Bath Cheese", "Bavarian Bergkase", "Baylough", "Beaufort",
    			"Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
    			"Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir",
    			"Bierkase", "Bishop Kennedy", "Blarney", "Bleu d'Auvergne",
    			"Bleu de Gex", "Bleu de Laqueuille", "Bleu de Septmoncel",
    			"Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
    			"Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini",
    			"Bocconcini (Australian)", "Boeren Leidenkaas", "Bonchester",
    			"Bosworth", "Bougon", "Boule Du Roves", "Boulette d'Avesnes",
    			"Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
    			"Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois",
    			"Brebis du Puyfaucon", "Bresse Bleu", "Brick", "Brie",
    			"Brie de Meaux", "Brie de Melun", "Brillat-Savarin", "Brin",
    			"Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
    			"Briquette de Brebis", "Briquette du Forez", "Broccio",
    			"Broccio Demi-Affine", "Brousse du Rove", "Bruder Basil",
    			"Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
    			"Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase",
    			"Button (Innes)", "Buxton Blue", "Cabecou", "Caboc", "Cabrales",
    			"Cachaille", "Caciocavallo", "Caciotta", "Caerphilly",
    			"Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
    			"Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux",
    			"Capricorn Goat", "Capriole Banon", "Carre de l'Est",
    			"Casciotta di Urbino", "Cashel Blue", "Castellano", "Castelleno",
    			"Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
    			"Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou",
    			"Chabichou du Poitou", "Chabis de Gatine", "Chaource", "Charolais",
    			"Chaumes", "Cheddar", "Cheddar Clothbound", "Cheshire", "Chevres",
    			"Chevrotin des Aravis", "Chontaleno", "Civray",
    			"Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby",
    			"Cold Pack", "Comte", "Coolea", "Cooleney", "Coquetdale",
    			"Corleggy", "Cornish Pepper", "Cotherstone", "Cotija",
    			"Cottage Cheese", "Cottage Cheese (Australian)", "Cougar Gold",
    			"Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
    			"Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche",
    			"Crescenza", "Croghan", "Crottin de Chavignol",
    			"Crottin du Chavignol", "Crowdie", "Crowley", "Cuajada", "Curd",
    			"Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
    			"Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo",
    			"Danish Fontina", "Daralagjazsky", "Dauphin", "Delice des Fiouves",
    			"Denhany Dorset Drum", "Derby", "Dessertnyj Belyj", "Devon Blue",
    			"Devon Garland", "Dolcelatte", "Doolin", "Doppelrhamstufel",
    			"Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
    			"Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra",
    			"Dunlop", "Dunsyre Blue", "Duroblando", "Durrus",
    			"Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
    			"Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne",
    			"Esbareich", "Esrom", "Etorki", "Evansdale Farmhouse Brie",
    			"Evora De L'Alentejo", "Exmoor Blue", "Explorateur", "Feta",
    			"Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
    			"Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis",
    			"Flor de Guia", "Flower Marie", "Folded",
    			"Folded cheese with mint", "Fondant de Brebis", "Fontainebleau",
    			"Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
    			"Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire",
    			"Fourme de Montbrison", "Fresh Jack", "Fresh Mozzarella",
    			"Fresh Ricotta", "Fresh Truffles", "Fribourgeois", "Friesekaas",
    			"Friesian", "Friesla", "Frinault", "Fromage a Raclette",
    			"Fromage Corse", "Fromage de Montagne de Savoie", "Fromage Frais",
    			"Fruit Cream Cheese", "Frying Cheese", "Fynbo", "Gabriel",
    			"Galette du Paludier", "Galette Lyonnaise",
    			"Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail",
    			"Garrotxa", "Gastanberra", "Geitost", "Gippsland Blue", "Gjetost",
    			"Gloucester", "Golden Cross", "Gorgonzola", "Gornyaltajski",
    			"Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
    			"Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
    			"Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh",
    			"Greve", "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny",
    			"Halloumi", "Halloumy (Australian)", "Haloumi-Style Cheese",
    			"Harbourne Blue", "Havarti", "Heidi Gruyere", "Hereford Hop",
    			"Herrgardsost", "Herriot Farmhouse", "Herve", "Hipi Iti",
    			"Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
    			"Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu",
    			"Isle of Mull", "Jarlsberg", "Jermi Tortes", "Jibneh Arabieh",
    			"Jindi Brie", "Jubilee Blue", "Juustoleipa", "Kadchgall", "Kaseri",
    			"Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
    			"Kikorangi", "King Island Cape Wickham Brie", "King River Gold",
    			"Klosterkaese", "Knockalara", "Kugelkase", "L'Aveyronnais",
    			"L'Ecir de l'Aubrac", "La Taupiniere", "La Vache Qui Rit",
    			"Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
    			"Langres", "Lappi", "Laruns", "Lavistown", "Le Brin",
    			"Le Fium Orbo", "Le Lacandou", "Le Roule", "Leafield", "Lebbene",
    			"Leerdammer", "Leicester", "Leyden", "Limburger",
    			"Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer",
    			"Little Rydings", "Livarot", "Llanboidy", "Llanglofan Farmhouse",
    			"Loch Arthur Farmhouse", "Loddiswell Avondale", "Longhorn",
    			"Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam", "Macconais",
    			"Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
    			"Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses",
    			"Maredsous", "Margotin", "Maribo", "Maroilles", "Mascares",
    			"Mascarpone", "Mascarpone (Australian)", "Mascarpone Torta",
    			"Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
    			"Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)",
    			"Meyer Vintage Gouda", "Mihalic Peynir", "Milleens", "Mimolette",
    			"Mine-Gabhar", "Mini Baby Bells", "Mixte", "Molbo",
    			"Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
    			"Monterey Jack", "Monterey Jack Dry", "Morbier",
    			"Morbier Cru de Montagne", "Mothais a la Feuille", "Mozzarella",
    			"Mozzarella (Australian)", "Mozzarella di Bufala",
    			"Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
    			"Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais",
    			"Neufchatel", "Neufchatel (Australian)", "Niolo", "Nokkelost",
    			"Northumberland", "Oaxaca", "Olde York", "Olivet au Foin",
    			"Olivet Bleu", "Olivet Cendre", "Orkney Extra Mature Cheddar",
    			"Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty", "Oszczypek",
    			"Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer",
    			"Panela", "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)",
    			"Parmigiano Reggiano", "Pas de l'Escalette", "Passendale",
    			"Pasteurized Processed", "Pate de Fromage", "Patefine Fort",
    			"Pave d'Affinois", "Pave d'Auge", "Pave de Chirac",
    			"Pave du Berry", "Pecorino", "Pecorino in Walnut Leaves",
    			"Pecorino Romano", "Peekskill Pyramid", "Pelardon des Cevennes",
    			"Pelardon des Corbieres", "Penamellera", "Penbryn", "Pencarreg",
    			"Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
    			"Picodon de Chevre", "Picos de Europa", "Piora",
    			"Pithtviers au Foin", "Plateau de Herve", "Plymouth Cheese",
    			"Podhalanski", "Poivre d'Ane", "Polkolbin", "Pont l'Eveque",
    			"Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
    			"Pourly", "Prastost", "Pressato", "Prince-Jean",
    			"Processed Cheddar", "Provolone", "Provolone (Australian)",
    			"Pyengana Cheddar", "Pyramide", "Quark", "Quark (Australian)",
    			"Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
    			"Queso Blanco", "Queso Blanco con Frutas --Pina y Mango",
    			"Queso de Murcia", "Queso del Montsec", "Queso del Tietar",
    			"Queso Fresco", "Queso Fresco (Adobera)", "Queso Iberico",
    			"Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
    			"Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette",
    			"Ragusano", "Raschera", "Reblochon", "Red Leicester",
    			"Regal de la Dombes", "Reggianito", "Remedou", "Requeson",
    			"Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata",
    			"Ridder", "Rigotte", "Rocamadour", "Rollot", "Romano",
    			"Romans Part Dieu", "Roncal", "Roquefort", "Roule",
    			"Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu",
    			"Saaland Pfarr", "Saanenkaese", "Saga", "Sage Derby",
    			"Sainte Maure", "Saint-Marcellin", "Saint-Nectaire",
    			"Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
    			"Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza",
    			"Schabzieger", "Schloss", "Selles sur Cher", "Selva", "Serat",
    			"Seriously Strong Cheddar", "Serra da Estrela", "Sharpam",
    			"Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene",
    			"Smoked Gouda", "Somerset Brie", "Sonoma Jack",
    			"Sottocenare al Tartufo", "Soumaintrain", "Sourire Lozerien",
    			"Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
    			"Stilton", "Stinking Bishop", "String", "Sussex Slipcote",
    			"Sveciaost", "Swaledale", "Sweet Style Swiss", "Swiss",
    			"Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
    			"Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea",
    			"Testouri", "Tete de Moine", "Tetilla", "Texas Goat Cheese",
    			"Tibet", "Tillamook Cheddar", "Tilsit", "Timboon Brie", "Toma",
    			"Tomme Brulee", "Tomme d'Abondance", "Tomme de Chevre",
    			"Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans",
    			"Tommes", "Torta del Casar", "Toscanello", "Touree de L'Aubier",
    			"Tourmalet", "Trappe (Veritable)", "Trois Cornes De Vendee",
    			"Tronchon", "Trou du Cru", "Truffe", "Tupi", "Turunmaa",
    			"Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
    			"Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco",
    			"Vendomois", "Vieux Corse", "Vignotte", "Vulscombe",
    			"Waimata Farmhouse Blue", "Washed Rind Cheese (Australian)",
    			"Waterloo", "Weichkaese", "Wellington", "Wensleydale",
    			"White Stilton", "Whitestone Farmhouse", "Wigmore",
    			"Woodside Cabecou", "Xanadu", "Xynotyro", "Yarg Cornish",
    			"Yarra Valley Pyramid", "Yorkshire Blue", "Zamorano",
    			"Zanetti Grana Padano", "Zanetti Parmigiano Reggiano" };
    
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		ListView listView = (ListView) findViewById(R.id.lvCommonListView);
    		listView.setAdapter(new BaseAdapter()
    		{
    			@Override
    			public View getView(int position, View convertView, ViewGroup parent)
    			{
    				TextView textView = new TextView(ListViewActivity.this);
    				textView.setText(items[position]);
    				return textView;
    			}
    			@Override
    			public long getItemId(int position)
    			{
    				return position;
    			}
    
    			@Override
    			public Object getItem(int position)
    			{
    				return items[position];
    			}
    
    			@Override
    			public int getCount()
    			{
    				return items.length;
    			}
    		});
    	}
    }
    (2)为ListView列表添加复选框和选项按钮

    只看看下面的例子:

    布局文件:

    <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<TextView android:layout_width="fill_parent"
    		android:layout_height="wrap_content" android:text="CheckedTextView"
    		android:background="#FFF" android:textColor="#000" android:gravity="center" />
    	<ListView android:id="@+id/lvCheckedTextView"
    		android:layout_width="fill_parent" android:layout_height="wrap_content" />
    	<TextView android:layout_width="fill_parent"
    		android:layout_height="wrap_content" android:text="RadioButton"
    		android:background="#FFF" android:textColor="#000" android:gravity="center"  />
    	<ListView android:id="@+id/lvRadioButton"
    		android:layout_width="fill_parent" android:layout_height="wrap_content" />
    	<TextView android:layout_width="fill_parent"
    		android:layout_height="wrap_content" android:text="CheckBox"
    		android:background="#FFF" android:textColor="#000" android:gravity="center"  />
    	<ListView android:id="@+id/lvCheckBox" android:layout_width="fill_parent"
    		android:layout_height="wrap_content" />
    </LinearLayout></span><span style="font-size:18px;">
    </span>
    java实现文件:

    public class Main extends Activity
    {
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		ListView lvCheckedTextView = (ListView) findViewById(R.id.lvCheckedTextView);
    		ListView lvRadioButton = (ListView) findViewById(R.id.lvRadioButton);
    		ListView lvCheckBox = (ListView) findViewById(R.id.lvCheckBox);
    		String[] data = new String[]
    		{ "Android", "Meego" };
    
    		ArrayAdapter<String> aaCheckedTextViewAdapter = new ArrayAdapter<String>(
    				this, android.R.layout.simple_list_item_checked, data);
    		lvCheckedTextView.setAdapter(aaCheckedTextViewAdapter);
    		lvCheckedTextView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);             //设置选择模式(单多选)
    
    		// ArrayAdapter<String> aaCheckedTextViewAdapter = new
    		// ArrayAdapter<String>(this, android.R.layout.simple_list_item_2,
    		// android.R.id.text2,data);
    		// lvCheckedTextView.setAdapter(aaCheckedTextViewAdapter);
    		// lvCheckedTextView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    
    		ArrayAdapter<String> aaRadioButtonAdapter = new ArrayAdapter<String>(
    				this, android.R.layout.simple_list_item_single_choice, data);
    		lvRadioButton.setAdapter(aaRadioButtonAdapter);
    		lvRadioButton.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    
    		ArrayAdapter<String> aaCheckBoxAdapter = new ArrayAdapter<String>(this,
    				android.R.layout.simple_list_item_multiple_choice, data);
    		lvCheckBox.setAdapter(aaCheckBoxAdapter);
    		lvCheckBox.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    	}
    }
    (3)对列表的增、删、改操作

    这边主要是自己去实现Adapter,需要继承android.widget.BaseAdapter类。两个比较重要的方法getView和getCount(返回显示的列表的View对象和显示总数)
    例子:

    main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<LinearLayout android:orientation="horizontal"
    		android:layout_width="fill_parent" android:layout_height="wrap_content">
    		<Button android:id="@+id/btnAddText" android:layout_width="wrap_content"
    			android:layout_height="wrap_content" android:text="添加文本" />
    		<Button android:id="@+id/btnAddImage" android:layout_width="wrap_content"
    			android:layout_height="wrap_content" android:text="添加图像" />
    		<Button android:id="@+id/btnRemove" android:layout_width="wrap_content"
    			android:layout_height="wrap_content" android:text="删除当前项" />
    	</LinearLayout>
    	<LinearLayout android:orientation="horizontal"
    		android:layout_width="fill_parent" android:layout_height="wrap_content">
    		<Button android:id="@+id/btnModify" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="随机修改当前项" />
    	<Button android:id="@+id/btnRemoveAll" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="清空" />
    	</LinearLayout>
    	<ListView android:id="@+id/lvDynamic" android:layout_width="fill_parent"
    		android:layout_height="fill_parent" android:cacheColorHint="#00000000" />
    </LinearLayout>
    
    image.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
    	<ImageView android:id="@+id/imageview" android:layout_width="100dp"
    		android:layout_height="100dp" android:padding="10dp"/>
    </LinearLayout>
    
    text.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
    	<TextView android:id="@+id/textview" android:layout_width="fill_parent"
    		android:layout_height="wrap_content" android:padding="10dp"
    		android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>
    
    main.java

    public class Main extends Activity implements OnClickListener,
    		OnItemSelectedListener
    {
    
    	private static String[] data = new String[]
    	{
    			"天地逃生",
    			"保持通话",
    			"乱世佳人(飘)",
    			"怪侠一枝梅",
    			"第五空间",
    			"孔雀翎",
    			"变形金刚3(真人版)",
    			"星际传奇",
    			"《大笑江湖》剧中,小鞋匠是小沈阳,他常强出头,由不懂武功的菜鸟变成武林第一高手;赵本山则是个武功高强的大盗,被不会武功的小沈阳打败;程野扮演赵本山的手下皮丘,经常拖累赵本山。 其余角色都围绕小沈阳设置。" };
    
    	private ListView lvDynamic;
    	private ViewAdapter viewAdapter;
    	private int selectedIndex = -1;
    
    	private class ViewAdapter extends BaseAdapter
    	{
    		private Context context;
    		private List textIdList = new ArrayList();
    
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent)
    		{
    
    			
    			String inflater = Context.LAYOUT_INFLATER_SERVICE;
    			LayoutInflater layoutInflater = (LayoutInflater) context
    					.getSystemService(inflater);
    			LinearLayout linearLayout = null;
    			if (textIdList.get(position) instanceof String)
    			{
    
    				linearLayout = (LinearLayout) layoutInflater.inflate(
    						R.layout.text, null);
    				TextView textView = ((TextView) linearLayout
    						.findViewById(R.id.textview));
    				textView.setText(String.valueOf(textIdList.get(position)));
    			}
    			else if (textIdList.get(position) instanceof Integer)
    			{
    				linearLayout = (LinearLayout) layoutInflater.inflate(
    						R.layout.image, null);
    				ImageView imageView = (ImageView) linearLayout
    						.findViewById(R.id.imageview);
    				imageView.setImageResource(Integer.parseInt(String
    						.valueOf(textIdList.get(position))));
    			}
    			return linearLayout;
    		}
    
    		public ViewAdapter(Context context)
    		{
    			this.context = context;
    		}
    
    		@Override
    		public long getItemId(int position)
    		{
    			return position;
    		}
    
    		@Override
    		public int getCount()
    		{
    			return textIdList.size();
    		}
    
    		@Override
    		public Object getItem(int position)
    		{
    			return textIdList.get(position);
    		}
    
    		public void addText(String text)
    		{
    			textIdList.add(text);
    			notifyDataSetChanged();
    		}
    
    		public void addImage(int resId)
    		{
    			textIdList.add(resId);
    			notifyDataSetChanged();
    		}
    
    		public void remove(int index)
    		{
    			if (index < 0)
    				return;
    			textIdList.remove(index);
    			notifyDataSetChanged();
    		}
    
    		public void modify(int index, String text)
    		{
    			if (index < 0)
    				return;
    			if (textIdList.get(index) instanceof String)
    			{
    
    				textIdList.set(index, text);
    				notifyDataSetChanged();
    			}
    		}
    
    		public void removeAll()
    		{
    			textIdList.clear();
    			notifyDataSetChanged();
    		}
    
    	}
    
    	private int getImageResourceId()
    	{
    		int[] resourceIds = new int[]
    		{ R.drawable.item1, R.drawable.item2, R.drawable.item3,
    				R.drawable.item4, R.drawable.item5 };
    		return resourceIds[new Random().nextInt(resourceIds.length)];
    	}
    
    	@Override
    	public void onClick(View view)
    	{
    		switch (view.getId())
    		{
    			case R.id.btnAddText:
    				int randomNum = new Random().nextInt(data.length);
    				viewAdapter.addText(data[randomNum]);
    				break;
    
    			case R.id.btnAddImage:
    				viewAdapter.addImage(getImageResourceId());
    				break;
    			case R.id.btnRemove:
    				viewAdapter.remove(selectedIndex);
    				selectedIndex = -1;
    				break;
    			case R.id.btnModify:
    				viewAdapter.modify(selectedIndex,
    						data[new Random().nextInt(data.length)]);
    				selectedIndex = -1;
    				break;
    			case R.id.btnRemoveAll:
    				viewAdapter.removeAll();
    				break;
    
    		}
    	}
    
    	@Override
    	public void onItemSelected(AdapterView<?> parent, View view, int position,
    			long id)
    	{
    		selectedIndex = position;
    
    	}
    
    	@Override
    	public void onNothingSelected(AdapterView<?> parent)
    	{
    		// TODO Auto-generated method stub
    
    	}
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		lvDynamic = (ListView) findViewById(R.id.lvDynamic);
    		Button btnAddText = (Button) findViewById(R.id.btnAddText);
    		Button btnAddImage = (Button) findViewById(R.id.btnAddImage);
    		Button btnRemove = (Button) findViewById(R.id.btnRemove);
    		Button btnModify = (Button) findViewById(R.id.btnModify);
    		Button btnRemoveAll = (Button) findViewById(R.id.btnRemoveAll);
    		btnAddText.setOnClickListener(this);
    		btnAddImage.setOnClickListener(this);
    		btnRemove.setOnClickListener(this);
    		btnModify.setOnClickListener(this);
    		btnRemoveAll.setOnClickListener(this);
    
    		viewAdapter = new ViewAdapter(this);
    		lvDynamic.setAdapter(viewAdapter);
    		lvDynamic.setOnItemSelectedListener(this);
    	}
    }
    这边强调一下getview方法,ListView会根据当前可视的列表项决定什么时候调用给View方法,调用几次geiview方法。比如:ListView有1000项,但是getview方法并不会调用1000次,而是根据当前屏幕上可见或即将显示的列表项调用。

    (4)改变列表项的背景色

    直接看例子:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<RadioGroup android:layout_width="wrap_content"
    		android:layout_height="wrap_content">
    		<RadioButton android:id="@+id/rbdefault"
    			android:layout_width="wrap_content" android:layout_height="wrap_content"
    			android:text="默认颜色" android:checked="true"/>
    		<RadioButton android:id="@+id/rbGreen"
    			android:layout_width="wrap_content" android:layout_height="wrap_content"
    			android:text="绿色" />
    		<RadioButton android:id="@+id/rbSpectrum"
    			android:layout_width="wrap_content" android:layout_height="wrap_content"
    			android:text="光谱" />
    	</RadioGroup>
    	<ListView android:id="@+id/listview" android:layout_width="fill_parent"
    		android:layout_height="wrap_content" /> 
    </LinearLayout>
    
    java代码:

    public class Main extends Activity implements OnClickListener

    {
    	private Drawable defaultSelector;
    	private ListView listView;
    
    	@Override
    	public void onClick(View view)
    	{
    		switch (view.getId())
    		{
    			case R.id.rbdefault:
    				listView.setSelector(defaultSelector);   //改变背景色方法
    				break;
    			case R.id.rbGreen:
    				listView.setSelector(R.drawable.green);
    				break;
    			case R.id.rbSpectrum:
    				listView.setSelector(R.drawable.spectrum);
    				break;
    		}
    
    	}
    
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		String[] data = new String[]
    		{ "计算机", "英语", "物理", "化学" };
    		ArrayAdapter<String> aaAdapter = new ArrayAdapter<String>(this,
    				android.R.layout.simple_list_item_1, data);
    		listView = (ListView) findViewById(R.id.listview);
    		listView.setAdapter(aaAdapter);
    		defaultSelector = listView.getSelector();
    
    		RadioButton rbDefault = (RadioButton) findViewById(R.id.rbdefault);
    		rbDefault.setNextFocusDownId(R.id.listview);
    		rbDefault.setOnClickListener(this);
    		RadioButton rbGreen = (RadioButton) findViewById(R.id.rbGreen);
    		rbGreen.setNextFocusDownId(R.id.listview);
    		rbGreen.setOnClickListener(this);
    		RadioButton rbSpectrum = (RadioButton) findViewById(R.id.rbSpectrum);
    		rbSpectrum.setNextFocusDownId(R.id.listview);
    		rbSpectrum.setOnClickListener(this);
    
    	}
    }
    2、ExpandableListView控件

    ExpandableListView控件为可扩展列表控件,是ListView的子类。同样也需要一个Adapter,继承BaseExpandableListAdapter,其中两个核心的方法:getGroupView和getChildView

    下面一个例子:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    </LinearLayout>
    
    public class Main extends ExpandableListActivity
    {
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    
    		ExpandableListAdapter adapter = new MyExpandableListAdapter();
    		setListAdapter(adapter);
    		registerForContextMenu(getExpandableListView());
    	}
    	@Override
    	public void onCreateContextMenu(ContextMenu menu, View view,
    			ContextMenuInfo menuInfo)
    	{
    		ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuInfo;
    		int type = ExpandableListView
    				.getPackedPositionType(info.packedPosition);
    		String title = ((TextView) info.targetView).getText().toString();
    		if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD)
    		{
    			menu.setHeaderTitle("弹出菜单");
    			menu.add(0, 0, 0, title);
    		}
    	}
    
    	@Override
    	public boolean onContextItemSelected(MenuItem item)
    	{
    		ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item
    				.getMenuInfo();
    		String title = ((TextView) info.targetView).getText().toString();
    
    		Toast.makeText(this, title, Toast.LENGTH_SHORT).show();
    		return true;
    
    	}
    
    	public class MyExpandableListAdapter extends BaseExpandableListAdapter
    	{
    		private String[] provinces =
    		{ "辽宁", "山东", "江西", "四川" };
    		private String[][] cities =
    		{
    		{ "沈阳", "大连", "鞍山", "抚顺" },
    		{ "济南", "青岛", "淄博", "枣庄" },
    		{ "南昌", "景德镇" },
    		{ "成都", "自贡", "攀枝花" } };
    
    		public Object getChild(int groupPosition, int childPosition)
    		{
    			return cities[groupPosition][childPosition];
    		}
    
    		public long getChildId(int groupPosition, int childPosition)
    		{
    			return childPosition;
    		}
    
    		public int getChildrenCount(int groupPosition)
    		{
    			return cities[groupPosition].length;
    		}
    
    		public TextView getGenericView()
    		{
    			AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
    					ViewGroup.LayoutParams.FILL_PARENT, 64);
    
    			TextView textView = new TextView(Main.this);
    			textView.setLayoutParams(lp);
    			textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    			textView.setPadding(36, 0, 0, 0);
    			textView.setTextSize(20);
    			return textView;
    		}
    
    		public View getChildView(int groupPosition, int childPosition,
    				boolean isLastChild, View convertView, ViewGroup parent)
    		{
    			if(convertView == null)
    				convertView = getGenericView();
    			TextView textView = (TextView) convertView;			
    			textView.setText(getChild(groupPosition, childPosition).toString());
    			return textView;
    		}
    
    		public Object getGroup(int groupPosition)
    		{
    			return provinces[groupPosition];
    		}
    
    		public int getGroupCount()
    		{
    			return provinces.length;
    		}
    
    		public long getGroupId(int groupPosition)
    		{
    			return groupPosition;
    		}
    
    		public View getGroupView(int groupPosition, boolean isExpanded,
    				View convertView, ViewGroup parent)
    		{
    			if(convertView == null)
    				convertView = getGenericView();
    			TextView textView = (TextView) convertView;	
    			textView.setText(getGroup(groupPosition).toString());
    			return textView;
    		}
    
    		public boolean isChildSelectable(int groupPosition, int childPosition)
    		{
    			return true;
    		}
    
    		public boolean hasStableIds()
    		{
    			return true;
    		}
    	}
    }
    3、Spinner控件
    Spinner控件是一个下拉的列表控件,该控件用法与ListView控件类似,在转载数据也是需要一个Adapter对象。

    看例子:

    main.xml;

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<Spinner android:id="@+id/spinner1" android:layout_width="fill_parent"
    		android:layout_height="wrap_content" />
    	<Spinner android:id="@+id/spinner2" android:layout_width="fill_parent"
    		android:layout_height="wrap_content" android:layout_marginTop="20dp"/>
    </LinearLayout>
    
    item.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="horizontal" android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
    	<ImageView android:id="@+id/ivLogo" android:layout_width="60dp"
    		android:layout_height="60dp" android:src="@drawable/icon"
    		android:paddingLeft="10dp" />
    	<TextView android:id="@+id/tvApplicationName" android:textColor="#000"
    		android:layout_width="wrap_content" android:layout_height="fill_parent"
    		android:textSize="16dp" android:gravity="center_vertical"
    		android:paddingLeft="10dp" />
    </LinearLayout>
    
    java实现;

    public class Main extends Activity
    {
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
    		String[] mobileOS = new String[]
    		{ "Android", "IPhone", "Symbian", "Meego", "Window Phone7" };
    		ArrayAdapter<String> aaAdapter = new ArrayAdapter<String>(this,
    				android.R.layout.simple_spinner_item, mobileOS);
    		// 将上如下代码可以使列表项带RadioButton控件
    		// aaAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    		spinner1.setAdapter(aaAdapter);
    
    		Spinner spinner2 = (Spinner) findViewById(R.id.spinner2);
    		final List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
    		Map<String, Object> item1 = new HashMap<String, Object>();
    		item1.put("ivLogo", R.drawable.calendar);
    		item1.put("tvApplicationName", "多功能日历");
    		Map<String, Object> item2 = new HashMap<String, Object>();
    		item2.put("ivLogo", R.drawable.eoemarket);
    		item2.put("tvApplicationName", "eoeMarket客户端");
    		items.add(item1);
    		items.add(item2);
    		SimpleAdapter simpleAdapter = new SimpleAdapter(this, items,
    				R.layout.item, new String[]
    				{ "ivLogo", "tvApplicationName" }, new int[]
    				{ R.id.ivLogo, R.id.tvApplicationName });
    		spinner2.setAdapter(simpleAdapter);
    
    		spinner2.setOnItemSelectedListener(new OnItemSelectedListener()
    		{
    
    			@Override
    			public void onItemSelected(AdapterView<?> parent, View view,
    					int position, long id)
    			{
    				setTitle(items.get(position).get("tvApplicationName").toString());
    
    			}
    
    			@Override
    			public void onNothingSelected(AdapterView<?> parent)
    			{
    
    			}
    		});
    	}
    }

    以上是个人对列表控件的一些知识总结,欢迎大家阅读指点。

    展开全文
  • MFC 列表控件

    2015-10-07 15:53:33
    建立基于对话框的应用程序,新建一个列表控件List Ctrl和按钮控件,将列表控件的属性View 改为Report,并添加变量m_listctrl 在Dlg.cpp的初始化区域添加代码: // TODO: 在此添加额外的初始化代码 SetIcon(m_hIcon...
  • 虚拟列表控件

    2012-02-27 10:00:57
    一、什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。 二、为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就...
  • 如何使列表控件内部的布局随列表控件的改变而改变,如列表控件变大,列表的内部框架也变大
  • VC++ 列表控件应用

    2017-03-31 13:11:32
    声明:该程序的两个列表控件都是list样式,由于自己的需要,只有一列。 1.创建一个基于对话框的MFC应用程序,设置界面如下: 左边列表控件ID为IDC_LIST1,右边为IDC_LIST2,四个按钮ID从上到下依次是IDC_...
  • iOS 下拉列表控件

    2018-04-24 11:59:37
    自己封装了一个简单的下拉列表控件,会根据控件所在屏幕位置自动计算列表是该向上还是向下弹出,调用简单。 github地址: https://github.com/woheduole/EBDropdownListView 效果图 调用方式 // 数据源 ...
  • 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。 二、为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,
  • C#列表控件、信息导航控件概述

    千次阅读 2017-05-29 12:07:44
    C#列表控件指的是:ListBox(列表框)、CheckedListBox(带复选框的列表框)、ComboBox(组合框),它们为用户提供可选择(单选或者多选)的列表项;C#信息导航控件指的是:ListView(列表视图框)、TreeView(树视图框),...
  • 给出了关于VC/MFC高级控件编程的各种编程实例(21个实例),包含了所能遇到的大部分高级控件的编程资料,比如列表控件 ActiveX控件开发 日期和动画控件 IP地址控件 等等一些列控件的编程方法,很值得下载,(本资源...
  • Android常用列表控件

    千次阅读 2013-09-03 17:34:38
     列表控件用于显示数据集合,Android不是使用一种类型的控件管理显示和数据,而是将这两项功能分布用列表控件和适配器来实现。列表控件扩展了android.widget.AdapterView的类,包括ListView、GridView、Spinner和...
  • CListCtrl列表控件的基本用法

    千次阅读 2019-07-18 10:01:28
    列表控件是基本经常用到的控件,这里总结一下,方便以后使用。 需要设置的属性 View->Report:一般为报表 Edit Labels->TRUE:控件可以重命名 Always Show Selection->TRUE:设置选中焦点 变量绑定控件 ...
  • 虚拟列表控件使用

    2013-08-13 23:18:53
    虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。 二、为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这
  • qt5--列表控件QListWidget

    2019-09-25 13:41:41
    需要 #include <QListWidget> #include <QListWidgetItem>...QListWidget列表控件应当与QListWidgetItem一起使用,后者作为项被添加入列表控件中,也就是说列表控件中的每一项都是一个QListWidgetItem...
  • Android中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,在Android定义了3个列表控件:ListView、ExpandableListView和Spinner,其中Spinner就是在Windows中常见的下拉列表框。...
  • MFC列表控件的使用

    千次阅读 2017-11-15 21:58:01
    下面的m_list是为列表控件绑定的control类型的CListCtrl类变量,这些代码加在哪里就在哪里会显示出来CRect rect; // 获取编程语言列表视图控件的位置和大小 m_list.GetClientRect(&rect); // 为列表视图控件添加...
  • MFC之列表控件ListCtrl

    千次阅读 2019-09-13 09:57:14
    MFC列表控件ListCtrl如图: 列表控件ListCtrl样式属性(风格)有: Icon大图标,SmallIcon小图标、List列表、Report报告 ,但今天只谈Report报告样式: 一:基本操作 1. (1)InsertItem --- 插入一个主项(行) (2)...
  • VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一、未卜先知 1、编译运行后,点击“学生档案信息”,界面如下图所示...
  • 列表控件  列表相关的类:CListCtrl-父类是CWnd,本质是一个控件; CListView-父类是CView,本质是一个视图。相当于在视图中嵌入了一个CListCtrl控件  列表控件的使用  1.1 显示方式:LVS_ICON/LVS_...
  • 很多时候我们需要在一个地图容器中加载多个地图服务,这时候为了方便视图的管理和切换,我们通常会使用图层列表控件。但遗憾的是OpenLayers自带的控件中并不包含图层列表控件,因此我们需要自行实现。下面就来介绍...
  • Android中的列表控件非常灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,在android定义了3个列表控件 :ListView、ExpandableListView和Spinner,其中Spinner就是在Windows中常见的下拉列表框。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,165
精华内容 10,066
关键字:

列表控件