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>