Android学习四 listview控件

来源:互联网 发布:软件测试简历专业技能 编辑:程序博客网 时间:2024/05/20 12:24

      listview是Android中的一个控件,它的实现效果是在一个垂直方向上滚动显示条目,通常用于新闻界面的展示等。用listAdapter可以向listview中填充数据,以下是listview的基本使用步骤:

1.布局添加Listview

2.找到listview
3.创建一个Adapter适配器继承BaseAdapter,封装4个方法,其中getcount,getview必须封装
          getcount:告诉listview要显示的条目数
          getview:告诉listview每个条目显示的内容。

以上两个方法设置好之后就可以展示数据,以下两个方法不是必须设置,但是在设置条目点击事件时可能会用到。

          getItem:获得条目内容

          getItemId:获得条目编号

4.创建Adapter的一个对象,设置给listview。
           listview.setAdapter(ListAdapter adapter);

如果直接运用listview,它的性能会比较差,因为每当一个条目出现在界面时,他都会创建一个view对象,非常耗内存。可以使用convertView对listview进行简单的优化,convertView中会存储之前使用过的view对象,在创建view对象时之前只需要判断一下convertV对象之是否存在这个view对象,若存在直接复用,若不存在,在创建新的对象。

下面是实例代码:

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mContext = this;        //1、找到listview控件        ListView lv_simple = (ListView) findViewById(R.id.lv_simple);        //2、创建listAdapter对象        MyListAdapter listAdapter = new MyListAdapter();        //3、将adapter对象设置给listview        lv_simple.setAdapter(listAdapter);    }    //导入(赋写)方法alt+insert    //创建一个adapt类继承自BaseAdapter    class MyListAdapter extends BaseAdapter {        @Override        public int getCount() {            //告诉listview显示多少个条目            return 20;        }        //根据postion获取listview上条目对应的Bean数据,该方法不影响数据的展示,可以先不实现        @Override        public Object getItem(int i) {            return null;        }        //getItemId:用来获取条目postion行的id,该方法不影响数据的展示,可以先不实现        @Override        public long getItemId(int i) {            return 0;        }        //getview:告诉listview条目上显示的内容;返回一个View对象作为条目上的内容展示,        //该方法返回什么样的view,Listview的条目上就显示什么样的view。必须实现        //屏幕上每显示一个条目getview方法就会被调用一次;convertView:曾经使用过的view对象,可以被重复使用,使用前要判断。        @Override        public View getView(int i, View convertView, ViewGroup viewGroup) {            TextView view = null;            if(convertView!=null){//判断是否创建过view,若创建过就不再创建,避免创建过多view占用内存                view = (TextView)convertView;            }else{//为创建过view,创建新的view                view = new TextView(mContext);            }            view.setText("position"+i);//设置view的值            view.setTextSize(40);//设置view的大小            return view;        }    }

给条目设置点击事件:重写onItemClick方法,然后调用setOnItemClickListener方法。

另一种创建view对象的方法:在条目中显示内容需要view对象,上面是直接new出了一个view对象,当每个条目中显示的内容比较复杂时,这种方法就不适用了。这时,可以先将条目的布局文件写在xml文件中,然后使用inflate方法将xml对象转换成一个view对象。

下面是一个设置了点击事件,运用了inflate创建view对象的代码:

private Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;//1.找到控件ListView lv_news = (ListView) findViewById(R.id.lv_news);//2.获取新闻数据用list封装ArrayList<NewsBean> allNews = NewsUtils.getAllNews(mContext);//3.创建一个adapter设置给listviewNewsAdapter newsAdapter = new NewsAdapter(mContext, allNews);lv_news.setAdapter(newsAdapter);//4.设置listview条目的点击事件lv_news.setOnItemClickListener(this);}//listview的条目点击时会调用该方法 parent:代表listviw  view:点击的条目上的那个view对象   position:条目的位置  id: 条目的id@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {//需要获取条目上bean对象中url做跳转NewsBean bean = (NewsBean) parent.getItemAtPosition(position);String url = bean.news_url;//跳转浏览器Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse(url));startActivity(intent);}
private ArrayList<NewsBean> list;private Context context;//通过构造方法接受要显示的新闻数据集合public NewsAdapter(Context context,ArrayList<NewsBean> list){this.list = list;this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = null;//1.复用converView优化listview,创建一个view作为getview的返回值用来显示一个条目if(convertView != null){view = convertView;}else {//context:上下文, resource:要转换成view对象的layout的id, root:将layout用root(ViewGroup)包一层作为codify的返回值,一般传null//view = View.inflate(context, R.layout.item_news_layout, null);//将一个布局文件转换成一个view对象//通过LayoutInflater将布局转换成view对象//view =  LayoutInflater.from(context).inflate(R.layout.item_news_layout, null);//通过context获取系统服务得到一个LayoutInflater,通过LayoutInflater将一个布局转换为view对象LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);view = layoutInflater.inflate(R.layout.item_news_layout, null);}//2.获取view上的子控件对象ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);//3.获取postion位置条目对应的list集合中的新闻数据,Bean对象NewsBean newsBean = list.get(position);//4.将数据设置给这些子控件做显示item_img_icon.setImageDrawable(newsBean.icon);//设置imageView的图片item_tv_title.setText(newsBean.title);item_tv_des.setText(newsBean.des);return view;}
public class NewsBean {public String title;public String des;public Drawable icon; public String news_url;}
//封装新闻的假数据到list中返回public static ArrayList<NewsBean> getAllNews(Context context) {ArrayList<NewsBean> arrayList = new ArrayList<NewsBean>();for(int i = 0 ;i <100;i++){NewsBean newsBean = new NewsBean();newsBean.title ="全球爆发大规模电脑勒索病毒 中国多所高校被攻击";newsBean.des= "今天晚上,IT之家有不少小伙伴投稿称,在今晚20点左右,国内部分高校学生反映电脑被病毒攻击,文档被加密。攻击者称需支付比特币解锁。";newsBean.news_url= "http://www.sina.cn";newsBean.icon = context.getResources().getDrawable(R.drawable.ic_launcher);//通过context对象将一个资源id转换成一个Drawable对象。arrayList.add(newsBean);NewsBean newsBean1 = new NewsBean();newsBean1.title ="“一带一路”国际合作高峰论坛新闻中心开放";newsBean1.des= "一带一路”国际合作高峰论坛将于14日开幕,4000多名中外记者报名采访报道。今天上午,论坛新闻中心正式向媒体开放。";newsBean1.news_url= "http://www.baidu.cn";newsBean1.icon = context.getResources().getDrawable(R.drawable.icon);//通过context对象将一个资源id转换成一个Drawable对象。arrayList.add(newsBean1);NewsBean newsBean2 = new NewsBean();newsBean2.title ="中国将引进世界最大飞机?乌克兰工人:舍不得";newsBean2.des= "据英国BBC网站5月5日报道,2016年,中国航天工业总公司与乌克兰安东诺夫公司签署了有关安-225项目的合作协议,如果一切顺利,中国将很快启动安-225的量产项目。";newsBean2.news_url= "http://www.itheima.com";newsBean2.icon = context.getResources().getDrawable(R.drawable.icon2);//通过context对象将一个资源id转换成一个Drawable对象。arrayList.add(newsBean2);}return arrayList;}



0 0