ListView从入门到中级,android菜鸟级别,

来源:互联网 发布:在北京干什么挣钱知乎 编辑:程序博客网 时间:2024/06/06 23:44

1.先简单写一个运用ListView 的小程序,

因为ListView是用来展示大量数据的,作为入门,我们就先将数据提供好,所以使用String数组。

1)先在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"
    tools:context=".MainActivity" >
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

2)编辑MainActivity.java程序

public class MainActivity extends Activity {

    private String[] data={"Apple","Banana","Qrange","Watermelon","Pear","Grape","Pineaaple","Strawberry","Cherry","Mango"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,data);
        //数组中的数据是无法直接传递给LIstView的,需要借助适配器来完成
        //上面三个参数的意义分别是:当前上下文,ListView子项布局的id,要适配的数据。
        //可用于简单的显示一段文本
        ListView listView=(ListView)findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}

这样一个初步的小程序就写完了,下面的例子是在这个例子的基础上改写的

2.定制LiatView界面

1)定义一个实体类,作为ListView适配器的适配类型

public class Fruit {
    private String name;
    private int imageId;
    public Fruit(String name, int imageId) {
        super();
        this.name = name;
        this.imageId = imageId;
    }
    public String getName() {
        return name;//用来表示水果的名字
    }
    public int getImageId() {
        return imageId;//水果对应的图片资源的id
    }   
}

2)为ListView的子项定义一个我们自定义的布局,在layout目录下,新建fruit_item.xml

<?xml version="1.0" encoding="utf-8"?>

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

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <ImageView

        android:id="@+id/fruit_image"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

    <!-- imageView用于显示水果的图片 -->

    <TextView

        android:id="@+id/fruit_name"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:layout_marginLeft="10dip"/>

     <!-- TextView用于显示水果的名称 --> 

</LinearLayout>

3)创建一个系定义的适配器,下面虽然是一个程序,小妞建议当成三个例子来练习,三个同样的方法,不过第一个方法没有进行任何的优化,后面两个方法分别进行了优化

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;

    public FruitAdapter(Context context, int textViewResourceId,List<Fruit> objects) {

        super(context, textViewResourceId,objects);

        resourceId=textViewResourceId;

    }

    /*@Override

    public View getView(int position, View convertView, ViewGroup parent) {

        //这个方法在每个子项被滚动到屏幕内的时候都会被调用

        // TODO Auto-generated method stub

        Fruit fruit=getItem(position);//获取当前项的Fruit实例

        View view=LayoutInflater.from(getContext()).inflate(resourceId, null);//为这个子项加载我们传入的布局

        ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);

        TextView fruitName=(TextView)view.findViewById(R.id.fruit_name);

        fruitImage.setImageResource(fruit.getImageId());

        fruitName.setText(fruit.getName());

        return view;

    }*/

    //每次都去加载布局,需要进行优化

    /*@Override

    public View getView(int position, View convertView, ViewGroup parent) {

        // TODO Auto-generated method stub

        Fruit fruit=getItem(position);

        View view;

        if (convertView==null) {

            view=LayoutInflater.from(getContext()).inflate(resourceId, null);//加载布局

        }else {

            view=convertView;//如果不为空,直接对convertView进行重用

        }

        ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);

        TextView fruitName=(TextView)view.findViewById(R.id.fruit_name);//每次都去获取一次控件的实例

        fruitImage.setImageResource(fruit.getImageId());

        fruitName.setText(fruit.getName());

        return view;

    }*/

    ////每次都去获取一次控件的实例,继续进行优化

    public View getView(int position, View convertView, ViewGroup parent) {

        // TODO Auto-generated method stub

        Fruit fruit=getItem(position);

        View view;

        ViewHolder viewHolder;

        if (convertView==null) {

            view=LayoutInflater.from(getContext()).inflate(resourceId, null);//加载布局

            viewHolder=new ViewHolder();

            viewHolder.fruitImage=(ImageView)view.findViewById(R.id.fruit_image);

            viewHolder.fruitName=(TextView)view.findViewById(R.id.fruit_name);

            view.setTag(viewHolder);

        }else {

            view=convertView;//如果不为空,直接对convertView进行重用

            viewHolder=(ViewHolder)view.getTag();//重新获取ViewHolder

        }

        viewHolder.fruitImage.setImageResource(fruit.getImageId());

        viewHolder.fruitName.setText(fruit.getName());

        return view;

    }

    class ViewHolder{

        ImageView fruitImage;

        TextView fruitName;

    }   
}

4)修改MainActivity.java中的代码

public class MainActivity extends Activity {

    private List<Fruit> fruitList=new ArrayList<Fruit>();

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initFruits();//这是自定义的方法,用来初始化Fruit,

        FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);

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

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new OnItemClickListener() {//这个是为每一次的点击设置监听器,这里使用了setOnClickListener为ListView注册了一个监听器

//每当用户点击屏幕中的任何一个子项时,都会掉哦那个onItemClick方法。通过Toast将获取到的水果的名字显示出来

            @Override

            public void onItemClick(AdapterView<?> parent, View view,

                    int position, long id) {

                // TODO Auto-generated method stub

                Fruit fruit=fruitList.get(position);

                Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_LONG).show();               

            }

        });

    }


    private void initFruits() {

        Fruit apple=new Fruit("Apple", R.drawable.ic_launcher);

        fruitList.add(apple);

        Fruit banana=new Fruit("Banana", R.drawable.ic_launcher);

        fruitList.add(banana);

        Fruit orange=new Fruit("Orange", R.drawable.ic_launcher);

        fruitList.add(orange);

        Fruit watermelon=new Fruit("Watermelon", R.drawable.ic_launcher);

        fruitList.add(watermelon);

        Fruit pear=new Fruit("Pear", R.drawable.ic_launcher);

        fruitList.add(pear);

        Fruit grape=new Fruit("Grape", R.drawable.ic_launcher);

        fruitList.add(grape);

        Fruit pineapple=new Fruit("Pineapple", R.drawable.ic_launcher);

        fruitList.add(pineapple);

        Fruit starwberry=new Fruit("Strawberry", R.drawable.ic_launcher);

        fruitList.add(starwberry);

        Fruit cherry=new Fruit("Cherry", R.drawable.ic_launcher);

        fruitList.add(cherry);

        Fruit mango=new Fruit("Mango", R.drawable.ic_launcher);

        fruitList.add(mango);

    }   

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

}

小妞的这篇博客,大家还是边看边敲吧,光看不顶用呀,小妞专属(摘自安卓《第一行代码 Android》)




























0 0
原创粉丝点击