listview 订阅
ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。 展开全文
ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。
信息
外文名
LISTVIEW
类    型
控件
功    能
可使用四种不同视图显示项目
属    性
计算机技术
LISTVIEW属性
DropHighlight属性(ListView, TreeView控件),LabelEdit属性,SelectedItem属性(ActiveX控件),ColumnHeaderIcons属性,Checkboxes属性,FullRowSelect属性,AllowColumnRecorder属性,FlatScrollBar属性,GridLines属性(ListView控件),HoverSelection属性,PictureAlignment属性,HotTracking属性,TextBackground属性,Arrange属性(ListView控件),ColumnHeaders属性(ListView控件),HideColumnHeaders属性(ListView控件),Icons,SmallIcons属性,ListItems属性(ListView控件),LabelWrap属性(ListView控件),MultiSelect属性(ListView,TabStrip控件),SorKey属性(ListView控件),SortOrder属性(ListView控件),View属性(ListView控件),Sorted属性(ListView控件),TabIndex属性,DragIcon属性,DragMode属性,MouseIcon属性,TabStop属性,HelpContextID属性,Name属性,Parent属性,Font属性,Container属性,ToolTipText属性,WhatsThisHelpID属性,OLEDragMode属性(ActiveX控件),OLEDropMode属性(ActiveX控件),Picture属性(ActiveX控件),Height,Width属性(ActiveX控件),Index属性(ActiveX控件),Left, Top属性(ActiveX控件),Tag属性(ActiveX控件),Object属性(ActiveX控件),Appearance属性(ActiveX控件),BackColor, ForeColor属性(ActiveX控件),BorderStyle属性(ActiveX控件),Enabled属性(ActiveX控件),HideSelection属性(ActiveX控件),hWnd属性(ActiveX控件),MousePointer属性(ActiveX控件)。
收起全文
精华内容
参与话题
问答
  • ListView的简单应用(一)

    万次阅读 多人点赞 2018-06-12 17:03:35
     ListView在Android众多控件中占有比较重要的地位,也是面试官热爱提问的控件之一,特别是关于它的性能优化。这一块我想着把他留到最后再说,我们先来谈谈ListView的简单应用,毕竟什么东西都是由浅入深的嘛。 ...

        犹豫了几天,觉得还是把这个教程写一下吧。虽然在网上已经一大堆了,但是这是我学习的历程我觉得我还是该记录下来,以后也可以温故而知新。

        ListView在Android众多控件中占有比较重要的地位,也是面试官热爱提问的控件之一,特别是关于它的性能优化。这一块我想着把它留到最后再说,我们先来谈谈ListView的简单应用,毕竟什么东西都是由浅入深的嘛。

        首先我们要先创建一个项目,打开Android studio点击File—New—New Project创建一个名为ListViewTest的项目。接着找到res—layout文件夹下的activity_main.xml,打开它并且在里面添加ListView控件如下:

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>

    此时你如果运行项目你会发现里面什么都没有,和刚开始创建的这个项目时没多大区别,因为我们还没有往里面添加数据并且在View中实现它。所以我们回到MainActivity这个类里面通过findViewById()这个方法找到这个控件并且实现。我们先定义一个名为data的一维字符串数组,用来存放我们的假数据。然后通过新建一个ArrayAdapter并根据要求配置它,再Adapte通过setAdapter给ListView,代码如下:

      private String data[] = {"aa","bb","cc","dd","aa","bb","cc","dd","aa","bb","cc","dd","aa","bb","cc","dd"};//假数据
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ListView listView = (ListView) findViewById(R.id.listview);//在视图中找到ListView
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);//新建并配置ArrayAapeter
            listView.setAdapter(adapter);
        }

    点击运行项目你就能看到一个简单的ListView:


    现在看到了界面了但是离我们的预想还是有点差距,我们希望的是除了能看还能点击响应某些事件,因此我们再为它添加一个监听点击的方法。代码如下:

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    switch (i){
                        case 0:
                            Toast.makeText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show();
                            break;//当我们点击某一项就能吐司我们点了哪一项
    
                        case 1:
                            Toast.makeText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show();
                            break;
    
                        case 2:
                            Toast.makeText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show();
                            break;
    
                        case 3:
                            Toast.makeText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show();
                            break;
    
                        case 4:
                            Toast.makeText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            });

    这里我就给了5项Item做了响应,当然也可以让每一项都有响应的,有兴趣自己可以去尝试。这样一个非常简单的ListView就完成了,接下来我们来深入一点点。

         现在我们要定制一个有图片有文字有选择框的ListView,怎么做呢?第一个我们肯定要把数据改一下,但是我们肯定不可能说把数组data改成二维数据就可以的,因为图片不是字符串的形式啊。那要包含字符串又能包含图片的数据格式有什么呢?这时Bean类就出现了,我们可以把这些数据封装到一个Bean类里面啊,当我们需要的时候就直接拿出来就好。说做就做然后我们定义一个myBean类,代码如下:

    public class myBean {
        private String text;//用来放文字的
        private int ImageID;//用来放图片的
    
    
        public myBean(String text,int imageID){
            this.ImageID = imageID;
            this.text = text;
    
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        public int getImageID() {
            return ImageID;
        }
    
        public void setImageID(int imageID) {
            ImageID = imageID;
        }
    
    
    }

            然后我们就可以通过初始化不断的New一个一个的数据了,但是我们怎么放进ListView里面呢?因为我们刚才用的是系统的ArrayAdapter来适配到ListView的,我们甚至连要适配的XML的界面都没。那我们先去做个我们要适配的界面去看看,于是:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:id="@+id/ll_view"
            android:gravity="center"
            android:layout_margin="10dp"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <ImageView
            android:background="@mipmap/ic_launcher"
            android:id="@+id/headimage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
           android:layout_marginLeft="20dp"
            android:layout_weight="1"
            android:text="你是SB"
            android:id="@+id/headtext"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
            <RadioGroup
                android:id="@+id/radioBtn"
                android:orientation="horizontal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
        <RadioButton
            android:text="打他"
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="不打"
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
            </RadioGroup>
        </LinearLayout>
    </LinearLayout>

        于是我们把之前的R.layout.simple_list_item_1这XML换成我们直接做的,运行程序你就会发现程序崩了。哈哈,不要紧这是正常的因为我们传入的数据都没用适配到我们的界面上。所以我们就只能自己写过一个适配器来适配我们自己的数据。

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);

        适配器代码如下:

    public class myAdapter extends ArrayAdapter {
    
        private final int ImageId;
        private String radiotext;
        public myAdapter(Context context, int headImage, List<myBean> obj){
            super(context,headImage,obj);
            ImageId = headImage;//这个是传入我们自己定义的界面
    
        }
    
        @NonNull
        @Override
        public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            myBean myBean = (myBean) getItem(position);
            View view = LayoutInflater.from(getContext()).inflate(ImageId,parent,null);//这个是实例化一个我们自己写的界面Item
            LinearLayout linearLayout = view.findViewById(R.id.ll_view);
            ImageView headImage = view.findViewById(R.id.headimage);
            TextView headText = view.findViewById(R.id.headtext);
            RadioGroup radio = view.findViewById(R.id.radioBtn);
            headImage.setImageResource(myBean.getImageID());
            headText.setText(myBean.getText());
            radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {//检查Radio Button那个被点击了
                @Override
                public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
                    switch (i){
                        case R.id.radio1:
                            radiotext = "不打";
                            break;
                        case R.id.radio2:
                            radiotext = "打他";
                            break;
                    }
                }
            });
            linearLayout.setOnClickListener(new View.OnClickListener() {//检查哪一项被点击了
                @Override
                public void onClick(View view) {
                    Toast.makeText(getContext(),"你点击了第"+position+"项"+"你选择"+radiotext,Toast.LENGTH_SHORT).show();
                }
            });
            return view;
        }
    }

            现在适配器也写好了,你看定制ListView的2个步骤是不是就这样就被我们解决了,然后我们就差适配了。接下来我们来做一下适配:

    public class MainActivity extends AppCompatActivity {
    
        private List<myBean> myBeanList = new ArrayList<>();//用来存放数据的数组
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ListView listView = (ListView) findViewById(R.id.listview);
            init();
            myAdapter adapter = new myAdapter(MainActivity.this,R.layout.myitem,myBeanList);
          
            listView.setAdapter(adapter);
        }
        private void init(){//初始化数据
            myBean bean1 = new myBean("aa",R.mipmap.ic_launcher);
            myBeanList.add(bean1);
    
            myBean bean2 = new myBean("ss",R.mipmap.ic_launcher);
            myBeanList.add(bean2);
    
            myBean bean3 = new myBean("jj",R.mipmap.ic_launcher);
            myBeanList.add(bean3);
    
            myBean bean4 = new myBean("hh",R.mipmap.ic_launcher);
            myBeanList.add(bean4);
    
            myBean bean5 = new myBean("dd",R.mipmap.ic_launcher);
            myBeanList.add(bean5);
    
            myBean bean6 = new myBean("cc",R.mipmap.ic_launcher);
            myBeanList.add(bean6);
    
            myBean bean7 = new myBean("bb",R.mipmap.ic_launcher);
            myBeanList.add(bean7);
            myBean bean8 = new myBean("jj",R.mipmap.ic_launcher);
            myBeanList.add(bean8);
            myBean bean9 = new myBean("kk",R.mipmap.ic_launcher);
            myBeanList.add(bean9);
        }

            做到这里我想大家都几乎初步掌握了怎么定制ListView了吧?哦对了!我在写适配器的时候顺便把监听事件写进去了,当然在主类写也是可以的,但是不建议这样做。至于为什么?你自己试试就知道了,因为纸上得来终觉浅嘛。

            最后上一张效果图吧:


        发现有好多BUG呢!不过那都不是事,毕竟没有哪个APP是没有BUG的是不是?各位如果有解决办法欢迎留言我哈,一起探讨探讨哲学,哦不,是BUG。

    原创链接:https://blog.csdn.net/weixin_40600325/article/details/80660780

    GItHub:https://github.com/muzhilei/ListViewDemo

    展开全文
  • ListView 组件

    千次阅读 2019-09-25 23:13:17
    简介: ListView是最常用的可滚动组件之一 有三种构建方式: ListView ListView.builder ListView.separated 主要参数说明: scrollDirection: Axis.horizontal 水平列表 Axis.vertical 垂直列表 padding: 内...

    简介: ListView是最常用的可滚动组件之一
    有三种构建方式:

    • ListView
    • ListView.builder
    • ListView.separated

    主要参数说明:

    scrollDirection: Axis.horizontal 水平列表
    				 Axis.vertical 垂直列表
    padding: 内边距
    resolve: 组件反向排序
    children: 列表元素
    itemBuilder:(ListView.builder、ListView.separated固有的) 它是列表项的构建器,类型为IndexedWidgetBuilder,(ListView.builder、ListView.separated固有的) 返回值为一个widget。当列表滚动到具体的index位置时,会调用该构建器构建列表项。
    itemCount:列表项的数量,如果为null,则为无限列表。
    

    一、ListView
    适合场景: 适合只有少量的子组件的情况,需要将所有children都提前创建好,即通过默认构造函数构建的ListView没有应用基于Sliver的懒加载模型

    示例代码:

    ListView(
      shrinkWrap: true, 
      padding: const EdgeInsets.all(20.0),
      children: <Widget>[
        const Text('I\'m dedicating every day to you'),
        const Text('Domestic life was never quite my style'),
        const Text('When you smile, you knock me out, I fall apart'),
        const Text('And I thought I was so smart'),
      ],
    );
    

    二、ListView.builder
    适合场景: 适合列表项比较多(或者无限)的情况,因为只有当子组件真正显示的时候才会被创建,也就说通过该构造函数创建的ListView是支持基于Sliver的懒加载模型的。

    示例代码:

    ListView.builder(
        itemCount: 100,
        itemExtent: 50.0, //强制高度为50.0
        itemBuilder: (BuildContext context, int index) {
          return ListTile(title: Text("$index"));
        }
    );
    

    运行效果如下图:
    在这里插入图片描述
    三、ListView.separated
    适合场景: 和ListView.builder适用场景一样的,它比ListView.builder多了一个separatorBuilder参数,该参数是一个分割组件生成器,可用在生成的列表项之间。

    下面我们看一个例子:奇数行添加一条蓝色下划线,偶数行添加一条绿色下划线。

    class ListView3 extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        //下划线widget预定义以供复用。  
        Widget divider1=Divider(color: Colors.blue,);
        Widget divider2=Divider(color: Colors.green);
        return ListView.separated(
            itemCount: 100,
            //列表项构造器
            itemBuilder: (BuildContext context, int index) {
              return ListTile(title: Text("$index"));
            },
            //分割器构造器
            separatorBuilder: (BuildContext context, int index) {
              return index%2==0?divider1:divider2;
            },
        );
      }
    }
    

    效果图如下:
    在这里插入图片描述
    四、实战一:添加固定列表头的处理方式
    在弹性布局中,可以使用Expanded自动拉伸组件大小,并且Column是继承自Flex的,所以可以直接使用Column+Expanded来实现

    @override
    Widget build(BuildContext context) {
      return Column(children: <Widget>[
        ListTile(title:Text("商品列表")),
        Expanded(
          child: ListView.builder(itemBuilder: (BuildContext context, int index) {
            return ListTile(title: Text("$index"));
          }),
        ),
      ]);
    }
    

    在这里插入图片描述
    五、实战二:无限加载列表
    假设我们要从数据源异步分批拉取一些数据,然后用ListView展示,当我们滑动到列表末尾时,判断是否需要再去拉取数据,如果是,则去拉取,拉取过程中在表尾显示一个loading,拉取成功后将数据插入列表;如果不需要再去拉取,则在表尾提示"没有更多"。代码如下:

    class InfiniteListView extends StatefulWidget {
      @override
      _InfiniteListViewState createState() => new _InfiniteListViewState();
    }
    
    class _InfiniteListViewState extends State<InfiniteListView> {
      static const loadingTag = "##loading##"; //表尾标记
      var _words = <String>[loadingTag];
    
      @override
      void initState() {
        super.initState();
        _retrieveData();
      }
    
      @override
      Widget build(BuildContext context) {
        return ListView.separated(
          itemCount: _words.length,
          itemBuilder: (context, index) {
            //如果到了表尾
            if (_words[index] == loadingTag) {
              //不足100条,继续获取数据
              if (_words.length - 1 < 100) {
                //获取数据
                _retrieveData();
                //加载时显示loading
                return Container(
                  padding: const EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: SizedBox(
                      width: 24.0,
                      height: 24.0,
                      child: CircularProgressIndicator(strokeWidth: 2.0)
                  ),
                );
              } else {
                //已经加载了100条数据,不再获取数据。
                return Container(
                    alignment: Alignment.center,
                    padding: EdgeInsets.all(16.0),
                    child: Text("没有更多了", style: TextStyle(color: Colors.grey),)
                );
              }
            }
            //显示单词列表项
            return ListTile(title: Text(_words[index]));
          },
          separatorBuilder: (context, index) => Divider(height: .0),
        );
      }
    
      void _retrieveData() {
        Future.delayed(Duration(seconds: 2)).then((e) {
          _words.insertAll(_words.length - 1,
              //每次生成20个单词
              generateWordPairs().take(20).map((e) => e.asPascalCase).toList()
          );
          setState(() {
            //重新构建列表
          });
        });
      }
    
    }
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 安卓ListView总结(一)

    万次阅读 多人点赞 2018-05-02 19:53:06
    安卓ListView总结(一) 安卓ListView性能优化(二) 安卓ListView下拉刷新和加载(三)我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的。ListView也是Android中比较难以使用的控件...

        安卓ListView总结(一)

        安卓ListView性能优化(二)

        安卓ListView下拉刷新和加载(三)

    我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的。ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法。

    一个ListView通常有两个职责。

    1)将数据填充到布局。

    2)处理用户的选择点击等操作。

    第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非常简单。

    一个ListView的创建需要3个元素。

    1ListView中的每一列的View

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

    3)连接数据与ListView的适配器。

    也就是说,要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterViewListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便

    Android中提供了很多的Adapter,表4-5列出了常用的几个。

    4-5常用适配器

    Adapter

    ArrayAdapter<T>

    用来绑定一个数组,支持泛型操作

    SimpleAdapter

    用来绑定在xml中定义的控件对应的数据

    SimpleCursorAdapter

    用来绑定游标得到的数据

    BaseAdapter

    通用的基础适配器

     

     其实适配器还有很多,要注意的是,各种Adapter只不过是转换的方式和能力不一样而已。下面就通过使用不同的Adapter来为ListView绑定数据(SimpleCursorAdapter暂且不讲,后面讲SQLite时会介绍)。

    4.12.1 ListView使用ArrayAdapter

    ArrayAdapter可以实现简单的ListView的数据绑定。默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。ArrayAdapter的使用非常简单。

    实例:

    工程目录:EX_04_12

    在布局文件中加入一个ListView控件。

    <?xmlversion="1.0"encoding="utf-8"?>
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >
    <!-- 添加一个ListView控件 -->
    <ListView
        android:id="@+id/lv"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    />
    </LinearLayout>

    然后在Activity中初始化。

    publicclass MyListView extends Activity {

    privatestaticfinal String[] strs = new String[] {
    "first", "second", "third", "fourth", "fifth"
    };//定义一个String数组用来显示ListView的内容
    private ListView lv;

    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lv = (ListView) findViewById(R.id.lv);//得到ListView对象的引用
    /*
    为ListView设置Adapter来绑定数据*/
    lv.setAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, strs));

    }
    }

                                              

                                    

                                            图4-29 ListView使用ArrayAdapter运行效果

    代码非常的简单,运行效果如图4-29所示。

     

    分析一下使用的步骤。

    1)定义一个数组来存放ListViewitem的内容。

    2)通过实现ArrayAdapter的构造函数来创建一个ArrayAdapter的对象。

    3)通过ListViewsetAdapter()方法绑定ArrayAdapter

    其中第二步有必要说一下的是,ArrayAdapter有多个构造函数,例子中实现的是最常用的一种。第一个参数为上下文,第二个参数为一个包含TextView,用来填充ListView的每一行的布局资源ID。第三个参数为ListView的内容。其中第二个参数可以自定义一个layout,但是这个layout必须要有TextView控件。通常我们使用Android提供的资源,除了例子中所用的,常用的还有如下几种,可实现带RadioButtonCheckBoxListView

    1)通过指定android.R.layout.simple_list_item_checked这个资源,实现带选择框的ListView。需要用setChoiceMode()方法设定选择为多选还是单选,否则将不能实现选择效果,运行效果如图4-30所示。

    实现代码如下:

    lv.setAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_checked, strs));
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

     (2)通过指定android.R.layout.simple_list_item_multiple_choice这个资源实现带CheckBoxListView。同样的,需要用setChoiceMode()方法来设置单选或者多选,运行效果如图4-31所示。

    实现代码如下:

    lv.setAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_multiple_choice, strs));
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    3)通过指定android.R.layout.simple_list_item_single_choice这个资源实现带RadioButtonListView。这里要注意的是,这里并不是指定了单选。是多选还是单选要通过setChoiceMode()方法来指定,运行效果如图4-32所示。

    实现代码如下:

     

    lv.setAdapter(newArrayAdapter<String>(this,

    android.R.layout.simple_list_item_single_choice,strs));

    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

     

              

         图4-30 带选择框的ListView                                           4-31 CheckBoxListView   

        4-32 RadioButtonListView

     

     在前面讲到过,ListView的职责除了填充数据外,还要处理用户的操作。通过如下的代码就可以为ListView绑定一个点击监听器,点击后在标题栏显示点击的行数。


    lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
    publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                        //点击后在标题上显示点击了第几行
    setTitle("你点击了第"+arg2+"行");
    }
    });

     

    4.12.2 ListView使用SimpleAdapter

    很多时候需要在列表中展示一些除了文字以外的东西,比如图片等。这时候可以使用SimpleAdapterSimpleAdapter的使用也非常简单,同时它的功能也非常强大。可以通过它自定义ListView中的item的内容,比如图片、多选框等。看一个例子,实现一个每一行都有一个ImageViewTextViewListView。先看一下运行效果,如图4-34所示。

                                                    

                                                     

                                                        4-34 带图标的ListView

     

    首先在布局文件中增加一个ListView控件。

     还需要定义一个ListView中每一行的布局,用RelativeLayout来实现一个带两行字和一个图片的布局。

    item.xml:

    <?xmlversion="1.0"encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height
    ="fill_parent"
    android:layout_width
    ="fill_parent">
    <ImageView
    android:layout_alignParentRight="true"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:id
    ="@+id/ItemImage"
    />
    <TextView
    android:id="@+id/ItemTitle"
    android:layout_height
    ="wrap_content"
    android:layout_width
    ="fill_parent"
    android:textSize
    ="20sp"
    />
    <TextView
    android:id="@+id/ItemText"
    android:layout_height
    ="wrap_content"
    android:layout_width
    ="fill_parent"
    android:layout_below
    ="@+id/ItemTitle"
    />
    </RelativeLayout>

     配置完毕,就可以在Java代码中为ListView绑定数据。

    publicclass MyListViewSimple extends Activity {

    private ListView lv;

    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

            lv = (ListView) findViewById(R.id.lv);
    /*定义一个动态数组*/
    ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
    /*在数组中存放数据*/
    for(int i=0;i<10;i++)
    {
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("ItemImage", R.drawable.icon);//加入图片
    map.put("ItemTitle", "第"+i+"行");
    map.put("ItemText", "这是第"+i+"行");
    listItem.add(map);
    }

    SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,//需要绑定的数据
    R.layout.item,//每一行的布局
    //动态数组中的数据源的键对应到定义布局的View中
    new String[] {"ItemImage","ItemTitle", "ItemText"},
    newint[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});

    lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器

    lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
    setTitle("你点击了第"+arg2+"行");//设置标题栏显示点击的行
    }
    });
    }
    }

     使用simpleAdapter的数据一般都是用HashMap构成的列表,列表的每一节对应ListView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件中对应控件上。这个布局文件一般根据自己的需要来自己定义。梳理一下使用SimpleAdapter的步骤。

    1)根据需要定义ListView每行所实现的布局。

    2)定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。

    3)构造SimpleAdapter对象。

    4)将LsitView绑定到SimpleAdapter上。

    4.12.3 ListView使用BaseAdapterListView的优化

    ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListViewItem所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。

     

                                                                           

     

    4-35 BaseAdapter中的方法

    使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法,看一下有哪些方法,如图4-35所示为继承自BaseAdapterSpeechListAdapter所实现的方法,其中最重要的即为getView()方法。这些方法都有什么作用呢?我们通过分析ListView的原理来为读者解答。

     

    当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()getItemId()则在需要处理和取得Adapter中的数据时调用。那么getView如何使用呢?如果有10000行数据,就绘制10000次?这肯定会极大的消耗资源,导致ListView滑动非常的慢,那应该怎么做呢?通过一个例子来讲解如何在使用BaseAdapter的时候优化ListView的显示。例子中将上一节中的ImageView换成Button,并且处理Button的点击事件,其中对ListView的显示做了优化。

     

    布局文件和上一例类同,读者可以在光盘的工程目录中查看,这里只给出Activity类。

    publicclass MyListViewBase extends Activity {

    private ListView lv;
    /*定义一个动态数组*/
    ArrayList<HashMap<String, Object>>listItem;


    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lv = (ListView) findViewById(R.id.lv);
    MyAdapter mAdapter = new MyAdapter(this);//得到一个MyAdapter对象
    lv.setAdapter(mAdapter);//为ListView绑定Adapter
    /*
    为ListView添加点击事件*/
    lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
    publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
    Log.v("MyListViewBase", "你点击了ListView条目" + arg2);//在LogCat中输出信息
    }
    });

    }
    /*添加一个得到数据的方法,方便使用*/
    private ArrayList<HashMap<String, Object>> getDate(){

    ArrayList<HashMap<String,Object>> listItem = new ArrayList<HashMap<String,Object>>();
    /*为动态数组添加数据*/
    for(int i=0;i<30;i++)
    {
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("ItemTitle", "第"+i+"行");
    map.put("ItemText", "这是第"+i+"行");
    listItem.add(map);
    }
    return listItem;

    }
    /*
    * 新建一个类继承BaseAdapter,实现视图与数据的绑定
    */
    privateclass MyAdapter extends BaseAdapter {

            private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局

    /*构造函数*/
    public MyAdapter(Context context) {
    this.mInflater = LayoutInflater.from(context);
    }

    @Override
    publicint getCount() {

    return getDate().size();//返回数组的长度
    }

    @Override
    public Object getItem(int position) {
    return null;
    }

    @Override
    publiclong getItemId(int position) {
    return 0;
    }
    /*书中详细解释该方法*/
    @Override
    public View getView(finalint position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    //观察convertView随ListView滚动情况
    Log.v("MyListViewBase", "getView " + position + " " + convertView);
    if (convertView == null) {
    convertView = mInflater.inflate(R.layout.item,null);
    holder = new ViewHolder();
    /*得到各个控件的对象*/
    holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
    convertView.setTag(holder);//绑定ViewHolder对象
    }else{
    holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
    }
                /*设置TextView显示的内容,即我们存放在动态数组中的数据*/
    holder.title.setText(getDate().get(position).get("ItemTitle").toString());
    holder.text.setText(getDate().get(position).get("ItemText").toString());

                /*为Button添加点击事件*/
    holder.bt.setOnClickListener(new OnClickListener() {

    @Override
    publicvoid onClick(View v) {
    Log.v("MyListViewBase", "你点击了按钮" + position);//打印Button的点击信息
    }
    });

            return convertView;
            }

    }
        /*存放控件*/
        publicfinalclass ViewHolder{
        public TextView title;
        public TextView text;
        public Button bt;
    }
    }

     运行效果如图4-36所示。还需要注意的是,Button会抢夺ListView的焦点,需要将Button设置为没有焦点。设置非常简单,只需要在xmlButton标签下加入一行:android:focusable=“false”代码就可以了。在LogCat观察点击后输出的信息,如图4-37所示。

                                                      

                                图4-36 使用BaseAdapterListView

                            

                                 4-37 点击ListView条目和Button得到的输出

    代码中getView()方法不容易理解。其实完全可以不用所谓的convertViewViewHolder,直接导入布局并且设置控件显示的内容就可以了。但是这意味着有多少行数据就需要绘制多少行ListView,这显然是不可取的。这里采用了一种优化的方法。代码中,在getView()方法中加入了一行log输出convertView的内容。滚动ListView,输出信息如图4-38所示。

    从图4-38中可以看出,当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。

    还可以继续优化。虽然重复利用了已经绘制的view,但是要得到其中的控件,需要在控件的容器中通过findViewById的方法来获得。如果这个容器非常复杂,这显然会增加系统资源的开销。在上面的例子中,引入了Tag的概念。或许不是最好的办法,但是它确实能使ListView变得更流畅。代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

                             

    4-38 滚动ListView输出的convertView的值

    总结一下,这节介绍了用BaseAdapter来绑定ListView的数据。因为BaseAdapter非常灵活,使用也相对较其他控件麻烦。同时ListView的优化问题也值得读者去研究,一个流畅的ListView会带来更好的用户体验。

    转载于:https://www.cnblogs.com/sowhat4999/p/4439842.html

    展开全文
  • ListView使用方法

    千次阅读 2018-07-28 13:59:02
    ListView使用方法总结 - 直接使用ListView组件创建列表 - 通过Activity继承ListActivity创建 - 定制ListView界面 直接使用ListView组件创建列表 通过数组资源文件指定列表项 先在XML布局文件中添加...

    ListView使用方法总结


    - 直接使用ListView组件创建列表

    - 通过Activity继承ListActivity创建

    - 定制ListView界面


    直接使用ListView组件创建列表

    通过数组资源文件指定列表项

    1. 先在XML布局文件中添加ListView标志,设置好相关属性;在values下创建数组资源文件arrays.xml,添加字符串数组intype
            <resources>
                <string-array name="intype">
                    <item>关机</item>
                    <item>飞行模式</item>
                    <item>重新启动</item>
                    <item>数据网络模式</item>
                </string-array>
            </resources>

    在ListView布局中使用”android:entries =@arrays/intype”指定列表项

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/list1"
        android:entries="@array/intype">
    </ListView>

    注意:资源数组只能指定纯文字的列表项
    效果:
    这里写图片描述


    2 . 第二种是使用适配器指定列表项,去掉布局中属性”android:entries =@arrays/intype”,然后在Activity 文件中添加ArrayAdapter (通常用于纯文本列表项) 调用ArrayAdapter.createFromResource()创建适配器

     ListView lst=findViewById(R.id.list1);
            ArrayAdapter <CharSequence> ad = ArrayAdapter.createFromResource(this,
                    R.array.intype,android.R.layout.simple_dropdown_item_1line);
            lst.setAdapter(ad);

    其中 android.R.layout.simple_dropdown_item_1line用于指定ListView外观形式
    常用的有以下几个:
    - simple_list_item_1:普通文本
    - simple_list_item_2:普通文本,字体较大
    - simple_list_item_checked:带有勾选框的列表项
    - simple_list_item_multiple_choice:带有多选框文本
    - simple_list_item_single_choice:带有单选按钮的文本


    通过Activity继承ListActivity创建

    将Activity继承ListActivity,删除默认的布局文件,在onCreate()方法中创建适配器,调用setListAdapter()添加

    public class MainActivity extends ListActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            String[] ctype = new String[]{"新增支出", "新增收入", "我的支出", "我的收入", "数据管理", "系统设置"};
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, ctype);
    
            setListAdapter(adapter);
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    
        protected void onListItemClick(ListView l, View v, int position, long id) {
            super.onListItemClick(l, v, position, id);
            String result=l.getItemAtPosition(position).toString();
            Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
    
        }
    }

    效果:
    这里写图片描述


    定制ListView界面

    1、在默认的布局文件中添加ListView标志

        <ListView
            android:id="@+id/tongxunlu"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </ListView>

    2、src/layout中新建XML文件gvitem.xml,用于设置每一个列表的布局样式

        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/tongxuntu"
                    android:scaleType="centrInside"
                    android:layout_margin="10dp"/>
    
                <TextView
                    android:id="@+id/tonngxuntext"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:layout_gravity="center_vertical"
                    android:textSize="13sp"
                    android:textColor="#3b3b3b"/>
    
        </LinearLayout>
    

    3、在Activity文件中,实例化一个simpleAdapter适配器, List集合类用于添加图标、文本

     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            list=InitData();
            simpleAdapter=new SimpleAdapter(getActivity(),
                    list,
                    R.layout.frag2_gvitem,
                    new String[]{"image","title"},
                    new int[]{R.id.tongxuntu,R.id.tonngxuntext});
            listView.setAdapter(simpleAdapter);
    
        }
    
        private List<Map<String,Object>> InitData() {
    
            String [] name=new String[]{"新的朋友","群聊","标签","公众号"};
            //图片资源
            int [] image=new int[]{R.mipmap.friend,R.mipmap.group,R.mipmap.lable,R.mipmap.pub};
    
            List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
            for (int i=0;i<image.length;i++)
            {
                Map<String,Object> map=new HashMap<String, Object>();
                map.put("image",image[i]);
                map.put("title",name[i]);
                list.add(map);
            }
            return list;
        }

    效果:
    这里写图片描述

    展开全文
  • 虽然现在大家使用ListView的机会相对RecyclerView的机会较少,但官方并没有标注 ListView 类过期,哈哈,就说明它一定还是有他的特殊之处,这篇文章就来分析下,ListView的内部机制以及几个重要的点。 将从下面几个...
  • [WinForm]C# ListView用法详解

    千次阅读 2018-05-31 16:03:27
    转载自:http://blog.csdn.net/chen_zw/article/details/7910324#一ListView类1常用的基本属性2常用方法3常用事件二ListView的五种视图Details视图1列表头创建记得需要先创建列表头2添加数据项3显示项4移除某项5行高...
  • C#中ListView详解

    千次阅读 2019-01-15 11:35:20
    ListView是一个Windows 列表视图控件,该控件显示可用五种不同视图之一显示项的集合
  • C# ListView用法详解 很完整

    万次阅读 2015-09-12 15:49:46
    一、ListView类  1、常用的基本属性:  (1)FullRowSelect:设置是否行选择模式。(默认为false) 提示:只有在Details视图该属性才有意义。  (2) GridLines:设置行和列之间是否显示网格线。(默认为false)...
  • 在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过...
  • Android—— ListView 的简单用法及定制ListView界面

    万次阅读 多人点赞 2017-04-14 12:13:46
    一、ListView的简单用法 2. 训练目标 1) 掌握 ListView 控件的使用 2) 掌握 Adapter 桥梁的作用 二、定制ListView界面 1.训练目标 1) 掌握 ListView 控件的使用 2) 掌握如何自定义 Adapter 的使用
  • Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155
  • ListView

    千次阅读 2011-07-01 10:46:00
    ListView应该是android里最常用的显示数据的控件了。它用来将集合数据一个个抽取出来按照从头到尾往下显示的控件里,这些是在手机中经常看到的一些布局。 列表的显示需要三个元素:1.ListVeiw 用来展示列表的View...
  • ListView 和 Adapter 适配器的简单介绍

    万次阅读 多人点赞 2018-05-27 20:13:59
    1、ListView组件 存放数据的一个容器,显示在activity 上的。 2、Adapter 适配器 1)只有通过Adapter 才可以把列表中的数据映射到ListView 中。 2)种类: ArrayAdapter, BaseAdapter, ...
  • ListView乱谈之ListView的布局

    千次阅读 2015-09-26 18:09:15
    ListView 布局实现原理的简单总结
  • Android ListView功能扩展,实现高性能的瀑布流布局

    万次阅读 多人点赞 2015-10-08 09:11:01
    经过前面两篇文章的学习,我们已经对ListView进行了非常深层次的剖析,不仅了解了ListView的源码和它的工作原理,同时也将ListView中常见的一些问题进行了归纳和总结。 那么本篇文章是我们ListView系列三部曲的最后...
  • C# ListView用法详解

    万次阅读 多人点赞 2012-08-27 18:44:00
    一、ListView类  1、常用的基本属性:  (1)FullRowSelect:设置是否行选择模式。(默认为false) 提示:只有在Details视图该属性才有意义。  (2) GridLines:设置行和列之间是否显示网格线。(默认为false)...
  • android ListView 嵌套 ListView

    千次阅读 2018-08-11 18:24:56
    看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会...
  • android listView嵌套ListView,子listView第一个显示全了,其他的没显示。 ![图片说明](https://img-ask.csdn.net/upload/201708/22/1503391737_599360.jpg) 下面是我的代码。帮看看哪里有问题。。 这是第一个...
  • 前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: 《Android自定义控件三部... 前面两篇我们讲解了使用layoutAnimation和LayoutTransition实现ViewGroup中Item加载动画的方法,但他们都各自存在问题: layoutAn...
  • Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,项目详情http://blog.csdn.net/xiaanming/article/details/17539199

空空如也

1 2 3 4 5 ... 20
收藏数 211,503
精华内容 84,601
关键字:

listview