今天复习了listview控件的用法。
1.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" android:paddingTop="10dp" android:paddingLeft="10dp" tools:context=".MainActivity"> <ListView android:id="@+id/lv_1" android:layout_width="wrap_content" android:layout_height="match_parent"/> </LinearLayout>
2. 接下来修改 MainActivity 中的代码,如下:
public class MainActivity extends AppCompatActivity { private ListView mlist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mlist=(ListView)findViewById(R.id.lv_1); mlist.setAdapter(new adapter(MainActivity.this)); } }
3.adapter代码
(我的理解adapter相当于一个中转站,在被调用的时候将接收到的东西依次送到调用方)
public class adapter extends BaseAdapter { private Context mContext; private LayoutInflater mLayoutInflater; public adapter(Context context){ this.mContext=context; mLayoutInflater=LayoutInflater.from(context); } @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } class ViewHolder{ public TextView tv_1; public TextView tv_2; public TextView tv_3; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; if (convertView==null){ convertView=mLayoutInflater.inflate(R.layout.list_item,null); holder=new ViewHolder(); holder.tv_1=convertView.findViewById(R.id.tv_name); holder.tv_2=convertView.findViewById(R.id.tv_temp); holder.tv_3=convertView.findViewById(R.id.tv_place); convertView.setTag(holder); }else{ holder= (ViewHolder) convertView.getTag(); } //给控件赋值 holder.tv_1.setText("姓名"+"小明"); holder.tv_2.setText("体温"+"36.2"); holder.tv_3.setText("地址"+"中国"); return convertView; } }
数组中的数据实是无法直接传递给 ListView 的,我们还需要借助适配器来完成。 Android中提供了很多适配器的实现类,此处用 ArrayAdapter适配器。它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。ArrayAdapter 有多个构造函数的重载,根据实际情况来选择合适的一种。
这里我们提供的数据都是字符串,因此将ArrayAdapter 的泛型指定为 String,然后在 ArrayAdapter 的构造函数中依次 传入 上下文、ListView 子项布局的 id,以及要适配的数据。注意:我们使用了 android.R.layout.list_item作为 ListView 子项布局的 id,这是一个Android 内置的布局文件,里面只有一个 TextView ,可用于简单地显示一段文本。这样适配器就构建好了。
最后调用 ListView 的 setAdapter() 方法,将构建好的适配器对象传递进去,这样ListView 和数据之间的关联就建立好了。
list_item代码:
<?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"> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="15dp" android:layout_weight="1" android:text="姓名:" /> <TextView android:id="@+id/tv_temp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="体温" /> <TextView android:id="@+id/tv_place" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="所在地" /> </LinearLayout>