ListView

ListView 需要适配器 Adapter 将数据和视图结合在一起。常用的adapter有以下三种:

ArrayAdapter:
第一步:声明一个 ListView 属性,并声明一个属性用来存放数据。
private ListView  mListView;
 private  List<String> data;
第二步:初始化 ListView。
mListView  = new ListView(this);
第三步:给 ListView 绑定过适配器
参数1:是传递一个上下文对象
参数2:是系统提供的一种简单的的布局文件
参数3:是你要用ArrayList来显示的数据是什么

 mListView.setAdapter(new ArrayAdapter<String> (this,android.R.layout.simple_expandable_list_item_1,getData()));
还需要写getData 方法:
private  List<String> getData(){
        data = null;
        //如果一个方法可能会被多次调用,而这个方法中又存在对类成员变量的初始化赋值,
        // 在初始化之前,先将其置空
        data = new ArrayList<String>();
        data.add("张飞");
        data.add("带上开发");
        data.add("好好学");
        data.add("就不写");
        return  data;

第四步: 将ListView添加到Activity 上
setContentView(mListView)



SimpleAdapter:
第一步:创建一个布局文件,给每一个 Item 进行布局。
第二步:在 mainactivity 的布局文件中添加 listview 。
 <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
第三步:声明属性并进行初始化。
 private ListView mListView;
 mListView = (ListView) findViewById(R.id.listView);
第四步:创建一个 simpleAdapter 适配器。
参数1:是传递的一个上下文对象
参数2 :要显示的数据
参数3: 数据显示的布局文件
参数4:数据提取时用到的键
参数5:数据对应的布局文件中的控件ID
 SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item_layout,
new String[]{"image", "title", "info"},
new int[]{R.id.image, R.id.title, R.id.info});
写getData方法:

private List<Map<String, Object>> getData() {
        List<Map<String, Object>> list = new ArrayList<>();


        Map<String, Object> map = new HashMap<>();
        map.put("image", R.drawable.a4);
        map.put("title", "在水源");
        map.put("info", "之后束带结发");
        list.add(map);


        Map<String, Object> map1 = new HashMap<>();
        map1.put("image", R.drawable.a5);
        map1.put("title", "刻舟记");
        map1.put("info", "麻雀孙晓");
        list.add(map1);


        Map<String, Object> map2 = new HashMap<>();
        map2.put("image", R.drawable.a6);
        map2.put("title", "滕王阁序");
        map2.put("info", "秋水共长天一色");
        list.add(map2);


        return list;
}
第五步:将 adapter 和listView 进行绑定。
 mListView.setAdapter(adapter);

BaseAdapter:
第一步:创建一个布局文件对每一个Item进行布局。
第二步:在 mainActivity 中添加 ListView 控件。
<ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello World!" />
第三步:声明属性并进行初始化。
 private ListView mLsitView;
 mLsitView = (ListView) findViewById(R.id.listView);
第四步:创建一类(MyAdapter),继承自 BaseAdapter。
通时要建一个 News 类 和 viewHolder 类 方法的抽取
1. 实体类 news:

public class News {
    //存放图片, 资源都是采用Id 的形式存储
    private  int img;
    private  String title;
    private  String info;


    //初始化方法
    public  News (int img, String title, String info){
        this.img = img;
        this.title = title;
        this.info = info;




    }


    public int getImg() {
        return img;
    }


    public void setImg(int img) {
        this.img = img;
    }


    public String getTitle() {
        return title;
    }


    public void setTitle(String title) {
        this.title = title;
    }


    public String getInfo() {
        return info;
    }


    public void setInfo(String info) {
        this.info = info;
    }

2. Viewholder 类:
public class ViewHolder {
    //这里罗列的是所有的控件
    public ImageView imageView;
    public TextView titleView;
    public   TextView infoView;
}


3. MyAdapter: 继承自 BaseAdapter

里面有以下方法:
public int getCount() {
return list.size();
}

public Object getItem(int position)
{
return list.get(position);
}

public long getItemId(int position) {
return position;
}

@Override
    //获取 position 对应位置的视图
    public View getView(int position, View view, ViewGroup parent) {


        /**
         * 优化前的方式
         *
        //去获取指定的Layout 文件中间指定的id 的控件
 View v = LayoutInflater.from(context).inflate(R.layout.item_layout,null);

ImageView imageView= (ImageView) v.findViewById(R.id.image)
TextView titleView = (TextView) v.findViewById(R.id.text1);
TextView  infoView = (TextView) v.findViewById(R.id.text2);


        //拿到我们的数据
        News news = (News) getItem(position);
        //根据数据对界面进行赋值
        imageView.setBackgroundResource(news.getImg());
         titleView.setText(news.getTitle().toString());
        infoView.setText(news.getInfo().toString());


        return v;
         */


第二种优化:




第三种优化方式:
//优化后的方式
    // 利用缓存
    ViewHolder holder = new ViewHolder();
    News news = (News) getItem(position);
    if(view == null) {
        //将指定的布局文件转化成视图对象

        //这里是缓存的界面控件
        view = View.inflate(context, R.layout.item_layout, null);
       // holder = new ViewHolder();

        holder.imageView = (ImageView) view.findViewById(R.id.image);
        holder.titleView = (TextView) view.findViewById(R.id.text1);
        holder.infoView = (TextView) view.findViewById(R.id.text2);
        view.setTag(holder);

        news = (News) getItem(position);
        holder.imageView.setBackgroundResource(news.getImg());
        holder.titleView.setText(news.getTitle().toString());
        holder.infoView.setText(news.getInfo().toString());
    }else {
        holder = (ViewHolder) view.getTag();


    }
        return  view;
}




第五步:创建Adapter 并进行绑定:

MyAdapter adapter = new MyAdapter(this,getData());
mLsitView.setAdapter(adapter);


写 getData 方法赋值:

private List<News> getData(){
    List<News> list =new ArrayList<>();
    News new1 = new News(R.drawable.c,"美女","rijhfio");
    list.add(new1);
    News new2 = new News(R.drawable.a4,"DSDFS","DFS");
    list.add(new2);
    News new3 = new News(R.drawable.b,"SFSDF","SDDFSD");
    list.add(new3);
    News new4 = new News(R.drawable.b,"SFSDF","SDDFSD");
    list.add(new4);
    News new5 = new News(R.drawable.b,"SFSDF","SDDFSD");
    list.add(new5);
    News new6= new News(R.drawable.c,"美女","rijhfio");
    list.add(new6);






































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值