现在建网站做推广能赚钱吗,重庆铜梁网站建设报价,无锡装修公司做网站,自己网站可以加标志吗ListView与适配器
ListView是什么
ListView是一个以垂直方式在项目中显示视图的列表#xff08;即在一个窗口里可以滚动查看数据#xff0c;比如说查看聊天记录#xff09;#xff0c;是一种不能实现确定视图中的内容的适配器视图#xff08;adapter view#xff09…ListView与适配器
ListView是什么
ListView是一个以垂直方式在项目中显示视图的列表即在一个窗口里可以滚动查看数据比如说查看聊天记录是一种不能实现确定视图中的内容的适配器视图adapter view。数据和视图的绑定需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter)或ArrayAdapter(继承自BaseAdapter)又或者SimpleAdapter(继承自BaseAdapter)的类并重写getView()方法实现自己想要的功能。
适配器是什么
适配器是一个连接数据和AdapterViewListView就是一个典型的AdapterView还有RecyclerView等等的桥梁通过它能有效地实现数据与AdapterView的分离设置使AdapterView与数据的绑定更加简便修改更加方便。简单地来说就是把一些数据弄得适当以便于在View上显示。 常用的适配器
//1.BaseAdapter//BaseAdapter是最基本的适配器。它实际上就是一个抽象类它有四种抽象方法public int getCount() 得到Item的总数public Object getItem(int position) 根据position得到某个Item的对象public long getItemId (int position) 根据position得到某个ItemIdpublic View getView(int position, View convertView, ViewGroup parent) //得到相应position对应的Item视图position当前Item的位置convertView复用的View对象//2.ArrayAdapter//ArrayAdapter是BaseAdapter的子类与SimpleAdapter相同ArrayAdapter也不是抽象类与下面的SimpleA的用法类似开发者要在构造方法里传入相应的参数即可适配数据尝适配于TextView。public ArrayAdapterContext contextint resourceint textViewResourceId,T[] objects//需要适配的数据数组;//3.SimpleAdapter//SimpleAdapter继承自BaseAdapter实现了BaseAdapter的四个抽象方法。开发者需要在创建SimpleAdapter实例时在构造方法里传入相应的参数即可。要注意的是SimpleAdapter只能适配于CheckableTextViewImageView其中Checkable是一个接口CheckBox控件就实现了该接口。public SimpleAdapter(Context contextList? extends MapString, ?data,int resource,String[] from,int[] to);1.BaseAdapter
子项布局
?xml version1.0 encodingutf-8?RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_heightfill_parentandroid:layout_widthfill_parent Buttonandroid:layout_alignParentRighttrue android:layout_widthwrap_contentandroid:layout_heightwrap_content android:idid/ItemButtonandroid:text按钮android:focusablefalse/ TextView android:idid/ItemTitles android:layout_heightwrap_content android:layout_widthfill_parent android:textSize20sp/TextViewandroid:idid/ItemTexts android:layout_heightwrap_content android:layout_widthfill_parent android:layout_belowid/ItemTitles/
/RelativeLayoutMainActivity
public class ListViewBaseAdapter extends Activity {private ListView lv;/*定义一个动态数组*/ ArrayListHashMapString, Object listItem;Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view_base_adapter);lv (ListView) findViewById(R.id.base_lv);MyAdapter mAdapter new MyAdapter(this);//得到一个MyAdapter对象lv.setAdapter(mAdapter);//为ListView绑定Adapter /*为ListView添加点击事件*/ lv.setOnItemClickListener(new OnItemClickListener() {Overridepublic void onItemClick(AdapterView? arg0, View arg1, int arg2,long arg3) {Log.v(MyListViewBase, 你点击了ListView条目 arg2);//在LogCat中输出信息}});}/*添加一个得到数据的方法方便使用*/ private ArrayListHashMapString, Object getDate(){ArrayListHashMapString, Object listItem new ArrayListHashMapString,Object();/*为动态数组添加数据*/ for(int i0;i30;i) { HashMapString, Object map new HashMapString, Object(); map.put(ItemTitle, 第i行); map.put(ItemText, 这是第i行); listItem.add(map); } return listItem;}/* * 新建一个类继承BaseAdapter实现视图与数据的绑定*/ private class MyAdapter extends BaseAdapter {private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局 /*构造函数*/ public MyAdapter(Context context) {this.mInflater LayoutInflater.from(context);}Overridepublic int getCount() {return getDate().size();//返回数组的长度 }Overridepublic Object getItem(int position) {return null;}Overridepublic long getItemId(int position) {return 0;}/*书中详细解释该方法*/ Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder;//观察convertView随ListView滚动情况 Log.v(MyListViewBase, getView position convertView);if (convertView null) {convertView mInflater.inflate(R.layout.base_adapter_item,null);holder new ViewHolder();/*得到各个控件的对象*/ holder.title (TextView) convertView.findViewById(R.id.ItemTitles);holder.text (TextView) convertView.findViewById(R.id.ItemTexts);holder.bt (Button) convertView.findViewById(R.id.ItemButton);convertView.setTag(holder);//绑定ViewHolder对象 }else{holder (ViewHolder)convertView.getTag();//取出ViewHolder对象 }/*设置TextView显示的内容即我们存放在动态数组中的数据*/ holder.title.setText(getDate().get(position).get(ItemTitle).toString());holder.text.setText(getDate().get(position).get(ItemText).toString());/*为Button添加点击事件*/ holder.bt.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {Log.v(MyListViewBase, 你点击了按钮 position);//打印Button的点击信息}}); return convertView;}}/*存放控件*/ public final class ViewHolder{public TextView title;public TextView text;public Button bt;}
}2.ArrayAdapter
新建类Fruit作为ListView适配器的适配类型
package com.example.listviewtest;public class Fruit {private String name;private int imageId;public Fruit(String name, int imageId) {this.name name;this.imageId imageId;}public String getName() {return name;}public int getImageId() {return imageId;}}为ListView的子项指定一个我们自定义的布局在layout目录下新建fruit_item.xml
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationhorizontalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentImageViewandroid:idid/fruit_imageandroid:layout_widthwrap_contentandroid:layout_heightwrap_content /TextViewandroid:idid/fruit_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenter_verticalandroid:layout_marginLeft10dp //LinearLayout创建一个自定义的适配器FruitAdapter
public class FruitAdapter extends ArrayAdapterFruit {private int resourceId;//重写父类的构造函数//将上下文、ListView子项布局的id和数据都传递进来public FruitAdapter(Context context, int textViewResourceId,ListFruit objects) {super(context, textViewResourceId, objects);resourceId textViewResourceId;}Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 获取当前项的Fruit实例Fruit fruit getItem(position); //LayoutInflater.from(this); 获取LayoutInflater实例//使用LayoutInflater为子项加载我们传入的布局//inflate的三个参数要转换的xml布局、给加载好的布局再添加一个父布局、//是否让父布局的layout属性失效View view LayoutInflater.from(getContext()).inflate(resourceId, parent, false);TextView fruitName view.findViewById(R.id.fruit_name);ImageView fruitImage view.findViewById(R.id.fruit_image);fruitName.setText(fruit.getFruitName());fruitImage.setImageResource(fruit.getImageId());return view;
}修改MainActivity
public class MainActivity extends AppCompatActivity {private ListFruit fruitList new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化水果数据initFruits();FruitAdapter adapter new FruitAdapter(MainActivity.this, R.layout.fruit_item,fruitList);ListView listView (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);}private void initFruits() {//初始化水果数据的操作:比如/*Fruit apple new Fruit(Apple, R.drawable.apple_pic);*fruitList.add(apple);*Fruit banana new Fruit(Banana, R.drawable.banana_pic);*fruitList.add(banana);*/
}3.SimpleAdapter
simple_adapter_item.xml
?xml version1.0 encodingutf-8?RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_heightfill_parentandroid:layout_widthfill_parent ImageViewandroid:layout_alignParentRighttrue android:layout_widthwrap_contentandroid:layout_heightwrap_content android:idid/ItemImage/ TextView android:idid/ItemTitle android:layout_heightwrap_content android:layout_widthfill_parent android:textSize20sp/TextViewandroid:idid/ItemText android:layout_heightwrap_content android:layout_widthfill_parent android:layout_belowid/ItemTitle/
/RelativeLayoutMainActivity
private ListView lv;Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view_simple_adapter);lv (ListView) findViewById(R.id.lv2);/*定义一个动态数组*/ ArrayListHashMapString, Object listItem new ArrayList HashMapString,Object();/*在数组中存放数据*/for(int i0;i10;i) { HashMapString, Object map new HashMapString, Object(); map.put(ItemImage, R.drawable.ic_launcher);//加入图片 map.put(ItemTitle, 第i行); map.put(ItemText, 这是第i行); listItem.add(map); }//new String 数据来源 new int 数据到哪去SimpleAdapter mSimpleAdapter new SimpleAdapter(this,listItem,R.layout.simple_adapter_item,new String[] {ItemImage,ItemTitle, ItemText}, new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器 lv.setOnItemClickListener(new OnItemClickListener() {Overridepublic void onItemClick(AdapterView? arg0, View arg1, int arg2,long arg3) {setTitle(你点击了第arg2行);//设置标题栏显示点击的行 }});
}