ListView是在程序开发中经常要用到。在开发之中被用来做列表的设计实现。根据需求的列表中可能有很多数据,数据加载中原始的方法

1.一次全部加载数据,这肯定很耗内存,也影响性能,更好的方法

2.加载页面显示的数据,更优化的方法

3.使用复用技术,加载页面的数据。

方法一的实现:在布局文件中加入视图

布局文件activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<LinearLayout

android:id="@+id/linearlayout"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical" >

</LinearLayout>

</ScrollView>

主程序MainActivity.java

public class MainActivity extends ActionBarActivity {

private LinearLayout layout ;

private TextView textView;

private List<Person> list;

private ImageView  p_w_picpathView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

layout = (LinearLayout)findViewById(R.id.linearlayout);

list = addPerson();

//界面中显示多条数据

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

textView = new TextView(this);

p_w_picpathView = new ImageView(this);

p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);

textView.setTextColor(Color.BLUE);

textView.setText(list.get(i).toString());

//    在LinearLayout中加入View

layout.addView(p_w_picpathView);

layout.addView(textView);

}

}

private List<Person> addPerson() {

List<Person> list1 = new ArrayList<Person>();

Person person;

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

person = new Person("hhh", "zhangwwww", i);

list1.add(person);

}

return list1;

}

}

这个是简单列表简单的实现,Person类是个学生类包括name,info,age,三个字段。自定义了toString()方法,用于显示学生的姓名,信息和年龄。

在测试中,当把循环次数增到很大的时候,不能全部加载出所有的项,超出的不会显示。性能是最低的。

方法二:在布局中加入view性能很低,我们用ListView控件实现系统给BaseAdapter,SimpleAdapter,ArrayAdapter等等。实现性能的优化。它是在通过页面显示的个数,调用getView方法多少次来绘制界面,滑动的时候在重绘。

布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

<ListView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/list"

/>

</LinearLayout>

主程序MainActivity.java

public class MainActivity extends ActionBarActivity {

private ListView listView;

MyAdapter myAdapter;

private List<Person> list;

Button button;

private int pressedId = -1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView = (ListView)findViewById(R.id.list);

button = (Button)findViewById(R.id.button);

list = getListData();

myAdapter = new MyAdapter(this,list);

listView.setAdapter(myAdapter);

}

private List<Person> getListData() {

List<Person> list1  = new ArrayList<Person>();

Person person;

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

person = new Person("hhhh","ssss",i);

list1.add(person);

}

return list1;

}

}

   MyAdapte是继承BaseAdapter的类,重写public View getView(int arg0, View arg1, ViewGroup arg2) 方法。在这个方法中设置ListView控件中每行要显示的数据。简单的实现:

@Override

public View getView(int arg0, View arg1, ViewGroup arg2) {

//布局文件LinearLayout的id

linear = new LinearLayout(context);

//图片视图的ID

p_w_picpathView = new ImageView(context);

p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);

//加入到布局中

linear.addView(p_w_picpathView);

textView = new TextView(context);

textView.setTextColor(Color.BLUE);

textView.setText(person.get(arg0).toString());

linear.addView(textView);

//返回视图

return linear;

}

方法三:是在方法二的基础上改进。加入了item布局文件,独立控件ID的获取,判断视图是否在内存中存在。

item布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:descendantFocusability="blocksDescendants">

<ImageView

android:id="@+id/imgView_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<TextView android:id="@+id/textViewName_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

/>

<TextView android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textViewInfo_1"></TextView>

<Button

android:id="@+id/load_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/selector_bt_load"

></Button>

</LinearLayout>

ListView布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.feiliu.fllistview_2.MainActivity$PlaceholderFragment" >

<ListView

android:id="@+id/listView"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

></ListView>

</LinearLayout>

在MyAdapter中加入独立获取控件的ID的方法.

//view的声明在类的成员变量中声明

public void getViewId(){

imgView_1 = (ImageView) convertView.findViewById(R.id.imgView_1);

textViewName_1 = (TextView) convertView.findViewById(R.id.textViewName_1);

textViewInfo_1 = (TextView) convertView.findViewById(R.id.textViewInfo_1);

load_1 = (Button)convertView.findViewById(R.id.load_1);

}

在MyAdapter构造方法中调用一次,接下来是重写getView(int arg0, View arg1, ViewGroup arg2)方法。

protected View getView(int position, View convertView) {

//convertView是每一项的视图,判断是否为空,不为空就不重加载

if (convertView == null) {

convertView = mLayoutInflater.inflate(getResourceId(), null);

}

imgView_1.setBackgroundResource((Integer)arrayList.get(position).get("imgView"));

textViewName_1.setText((String)arrayList.get(position).get("imgName"));

textViewInfo_1.setText(arrayList.get(position).get("imgInfo").toString());

load_1.setText("下载");

return convertView;

}

主程序MainActivity.java

public class MainActivity extends ActionBarActivity {

private ArrayList<HashMap<String, Object>> arrayList;

private ListViewAdapter<HashMap<String, Object>> listViewAdapter;

private ListView listView;

String[] imgNames = new String[] { "刀塔传奇", "群星斗地主", "二战前线", "剑圣传奇首发",

"消灭星星", "黄金矿工3", "放开那三国", "3D捕鱼达人", "全民打飞机",

};

String[] imgInfos = new String[] { "互动网游|128.1M", "×××桌游|5.5M", "飞行射击|5.3M",

"互动网游|90.1M", "休闲趣味|3.6M", "休闲趣味|7.5M", "互动网游|95.0M", "休闲趣味|26.6M",

"飞行射击|5.4M", " };

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.listview);

arrayList = getData();

listView = (ListView) findViewById(R.id.listView);

listViewAdapter = new ListViewAdapter<HashMap<String, Object>>(this, this.arrayList);

listView.setAdapter(listViewAdapter);

}

private ArrayList<HashMap<String, Object>> getData() {

ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> map;

for (int j = 0; j < 9; j++) {

map = new HashMap<String, Object>();

map.put("imgView", R.drawable.ic_launcher);

map.put("imgName", imgNames[j * 3]);

map.put("imgInfo", imgInfos[j * 3]);

map.put("imgView1", R.drawable.ic_launcher);

map.put("imgName1", imgNames[j * 3 + 1]);

map.put("imgInfo1", imgInfos[j * 3 + 1]);

map.put("imgView2", R.drawable.ic_launcher);

map.put("imgName2", imgNames[j * 3 + 2]);

map.put("imgInfo2", imgInfos[j * 3 + 2]);

arrayList.add(map);

}

return arrayList;

}

}

ListView在开发中占的比重还是很重的。本人也是初学,有什么不当的请谅解。

转载于:https://blog.51cto.com/liwenchen/1545282

listview的使用相关推荐

  1. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)

    一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector  用户指定当前选中item 的颜色 ...

  2. Android ListView 删除 item

    实现效果 主要使用方法 是, remove 之后在刷新界面 adapter 里面的代码 public class MyAdapter extends BaseAdapter {private List ...

  3. ListView 添加头部 和尾部 布局 (addHeaderView 和 addFooterView)

    ListView 添加头部 和尾部 布局  其实很简单 ,listview 暴露的有方法addHeaderView 和 addFooterView 从源码里面可以看到, addHeaderView 和 ...

  4. Android ListView item设置分割线以及分割线宽度

    ListView item设置分割线的方法:setDivider ListView item设置分割线宽度的方法:setDividerHeight // 设置分割线 listView.setDivid ...

  5. Android ListView (多个adapter 说明)

    最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下 以下 demo 地址 ListView 在Android 里面用来实现列表的, 在xml 中创建ListView ...

  6. 玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  7. ListView style

    步骤一:在使用的ListView的activiey里使用android:theme="@style/Theme的名字" 步骤二:创建Themes.xml 在Themes.xml里定 ...

  8. Android自定义ListView的Item无法响应OnItemClick的解决办法

    转: 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就 ...

  9. 【原创】ListView快速滚动至新添加一行(自动滚动)

    在C#开发中我们经常要开发一些日志系统,尤其是基于ListView的日志显示系统. 但是当日志增多是你是否有一些困扰,就是它为什么不会自动滚动至最后一行. 以下是一小段代码,希望可以帮助你. publ ...

  10. Android使用ListView控件问题

    Android使用ListView控件问题: The application has stopped unexpectedly, please try again. 开发环境:android 1.6 ...

最新文章

  1. 如何判断照片是否ps
  2. svn版本控制git(github)
  3. Pixhawk之姿态解算篇(2)_mahony算法分析
  4. 搭建高吞吐量 Kafka 分布式发布订阅消息 集群
  5. python bytes转换为string_Python3 中 bytes 和 string 之间的互相转换
  6. array用法 numpy_python--numpy(3)
  7. 金立旗下18辆车产被司法拍卖 成交额近500万元
  8. Sublime Text 3配置与vim模式(待完整)
  9. Python+OpenCV:图像平滑
  10. openmeetings(开源视频会议系统)的详细安装步骤 (windows版)
  11. 1.java exception handing
  12. java数字猜大小游戏_Java之数字猜大小
  13. 7.5.3 QListWidgetItem条目视图介绍
  14. 几款好用播放器ijkplayer、vlc、SmartPlayer、ExoPlayer
  15. 第六篇,STM32脉冲宽度调制(PWM)编程
  16. excel学习07(笔记自用)
  17. 深入探索 Qt WebEngineCore:从基础原理到高级应用与技巧
  18. 【OpenCV 例程300篇】209. HSV 颜色空间的彩色图像分割
  19. dreamweaver cs5.5 绿色 下载 dw cs 5.5 绿色版下载
  20. 商业WIFI——资本寒冬中炙手可热的创业领域

热门文章

  1. 大数据帮助你提高销售业绩的4种方式
  2. 谷歌浏览器 手机/浏览器切换
  3. QuarkXPress 2018 Mac破解教程
  4. linux中长模式查看文件Is,Linux 查看文件内容(8)
  5. python中解包(unpack)
  6. 应用下载需警惕,“猜你妹”病毒潜伏应用市场伺机刷流氓应用
  7. 韩国11街店铺批量采集上传
  8. time 与 datetime模块
  9. 一周IT歪评 | 中兴员工坠亡事件进展/19岁女孩电脑被植入偷窥软件/周鸿祎怒怼92年女生
  10. Linux文件归档工具——cpio