Listview学习(一)

Listview学习(一)

Listview是安卓中非常常用的控件。下边是一些学习过程中的总结。
使用方法:
1.加载数据,数据类型可以是list,map,set等基本类型的相关类。
2.新建adapter,adapter比较常用的是arrayadapter,或者是复写baseadapter的getview方法得到的自定义adapter。
3.将adapter绑定到listview上
一个简单的示例如下:

package com.bupt.markfavor.demo0910listview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayAdapter adapter;
    public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",
    "blackberry","cherry","coconut","cumquat","fig","fresh"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        1.普通listview
        listView = (ListView) findViewById(R.id.listview);
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
        listView.setAdapte`````````
(adapter);    }
}

这个例子看起来并不复杂,但是在实际使用当中却有很多问题。当listview当中的item数量过多时,过快滑动条目会产生明显的卡顿现象。这是因为listview的每一个条目在使用过程中会不断地调用adapter里getview来获取新的内容,当条目数量过多滑动速度过快时,会重复加载新的view对象,不管该对象之前是否被加载过。因此,在实际使用中更多的时候是自定义adapter,在getview方法中定义viewholder,缓存已经出现过的条目,再利用convertview来进行判断该条目是否出现过,是否可以加载缓存。这样可以提升listview的效率。代码如下:



public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayAdapter adapter;
    public static String[]data=new String[]{"apple","banana","ananas","watermelon","apricot",
    "blackberry","cherry","coconut","cumquat","fig","fresh"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        1.普通listview
//        listView = (ListView) findViewById(R.id.listview);
//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
//        listView.setAdapter(adapter);
        //2.自定义adapter的listview,提升运行效率
        listView=(ListView)findViewById(R.id.listview);
        MyAdapter myAdapter = new MyAdapter(this);
        for (int i =0;i<=50;i++){
            myAdapter.addItem("item"+i);
        }
        listView.setAdapter(myAdapter);
    }
}

下面是自定义adapter,实现了检查convertview是否有缓存,用viewholder装载布局文件。

package com.bupt.markfavor.demo0910listview;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

import static android.content.ContentValues.TAG;

/**
 * Created by markfavor on 2017/9/13.
 */

public class MyAdapter extends BaseAdapter {
    private ArrayList<String>myData = new ArrayList<>();
    private LayoutInflater myInflater;

    public MyAdapter(Context context) {
        super();
        myInflater=LayoutInflater.from(context);
//        myInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);效果与上句相同
    }

    public void addItem(String a){
        myData.add(a);
        notifyDataSetChanged();//通知所有与已经改变数据相关联的观测者应当刷新数据
    }

    @Override
    public int getCount() {
        return myData.size();
    }

    @Override
    public Object getItem(int position) {
        return myData.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
        Log.d(TAG, "getView: "+position+","+convertView);
        if (convertView==null){
            holder=new ViewHolder();
            convertView=myInflater.inflate(R.layout.item1,null);
            holder.textview= (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        }else {
            holder= (ViewHolder) convertView.getTag();
        }
        holder.textview.setText(myData.get(position));
        return convertView;
    }
    public static class ViewHolder{
        public TextView textview;
    }
}

item1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center_vertical"
        android:text="text" />

</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值