ListView,Spinner

一、ListView

定义:ListView控件: 以垂直列表的方式显示数据内容,用户用上下滑动的方式查看数据,并且能够根据数据的长度自适应屏幕显示
数据源----绑定----> 适配器adpater----传递view--->listview(相当于很多组的view)

 

ListView 项目框架:

 实现效果:

MainActivity

//省略import

public class MainActivity extends AppCompatActivity {
    private ListView lv;
    private String[]names = {"iu1","iu2","iu3","iu4","iu5","iu6"};
    private int[] imageids = {R.drawable.iu1,R.drawable.iu2,R.drawable.iu3,R.drawable.iu4,R.drawable.iu5,R.drawable.iu6};
    // R.drawable.iu1 这个返回的是一个数字 所以这是一个 整形数组
    private List<Animal> ls; //创建一个 animals数组
    @Override


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialdata(); //初始化上面的 ls数组


        lv=findViewById(R.id.lv1); //先给 listview这个整体找到对应的layout文件 再用适配器填充数据
        lv.setAdapter(new AnimalAdapter()); //适配器是我们自己定义的适配器


        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(MainActivity.this,"被点击的对象是: " +ls.get(i).getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }
    //初始化数组的方法 将图片的id 和 名字 都放入ls数组中
    public void initialdata(){
        ls = new ArrayList<Animal>();
        for(int i=0;i<names.length;i++){
            ls.add(new Animal(imageids[i],names[i]));
        }
    }

    private class AnimalAdapter extends BaseAdapter{
        public AnimalAdapter() {
        }

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

        @Override
        public Object getItem(int i) {
            return null;
        }
        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        // 适配器最重要的 方法 将 view 对象 传递给 ListView
        public View getView(int i, View view, ViewGroup viewGroup) {
            Animal animal = ls.get(i); // 先取到 ls 数组 对应position上的 animal对象,animal由 imageid 和 name 组成
            View view1 = View.inflate(MainActivity.this,R.layout.item,null);
            //调用view 的 inflate方法 将条目布局文件(item.xml) 转换成 于此对应的view 对象 也就是 条目对象
            ImageView iv = view1.findViewById(R.id.iv_item);
            iv.setImageResource(animal.getImageid()); // 调用animal对象的get方法,用setImageResource方法 根据id 获取对应图片
            TextView tv = view1.findViewById(R.id.tv_item);
            tv.setTextSize(60);
            tv.setTextColor(Color.BLUE);
            tv.setText(animal.getName());
            return view1;
        }
    }
}

 Animal

public class Animal {
    private int imageid;
    private String name;
    public Animal(){

    }

    public Animal(int imageid, String name) {
        this.imageid = imageid;
        this.name = name;
    }

    public int getImageid() {
        return imageid;
    }

    public void setImageid(int imageid) {
        this.imageid = imageid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lv1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
</LinearLayout>

 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="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="250dp"
        android:layout_height="250dp"/>
    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

二、Spinner

Spinner是下拉列表,展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部以对话框形式展示列表,此时把SpinnerMode属性设置为dialog

dialog如图:

dropdown如图:

 

 项目布局:

 MainActivity

public class MainActivity extends AppCompatActivity {
    private Spinner sp;
    private List<String> ls ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //实例化列表
        ls = new ArrayList<String>();
        ls.add("iu1");
        ls.add("iu2");
        ls.add("iu3");
        ls.add("iu4");
        ls.add("iu5");
        ls.add("iu6");

        sp = findViewById(R.id.sp);
        sp.setAdapter(new MyAdapter());
        sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(MainActivity.this,ls.get(i).toString(),Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
    }

    private class MyAdapter extends BaseAdapter{
        public MyAdapter() {
        }

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

        @Override
        public Object getItem(int i) {
            return null;
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            String name = ls.get(i);
            View view1  = View.inflate(MainActivity.this,R.layout.item,null);
            TextView tv = view1.findViewById(R.id.tv);
            tv.setText(name);
        // 布局文件中 设置了文字大小,这里就不需要再设置了,如果再设置就会覆盖
            return view1;
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!--spinner 是外面的容器,里面是item,所以右边会留白-->
    <Spinner
        android:id="@+id/sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:spinnerMode="dialog"/>

</LinearLayout>

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="wrap_content"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv"
        android:textSize="70sp"
        android:layout_width="wrap_content"
        android:textColor="#88005EFF"
        android:layout_height="wrap_content"/>
</LinearLayout>