1.实现菜单的滚动
2.用法
(1)在布局文件中添加<ListView>
(2)在.java中添加代码
初始化适配器:ArrayAdapter<?> adapter = new ArrayAdapter<?>{//?除3根据添加的数据类型而定
MainActivity.this,android.R.layout.simple_list_item_1,data}//{}内变量一次为活动名,布局,数据
(3)ListView ListView = (ListView)findViewById(R.id.)
listView.setAdapter(adapter)
3.定制ListView
(1)制定适配器数据类型
eg:
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; } }
(2)定制布局
eg:
<?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"> <ImageView android:id="@+id/fruit_image" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp"/> </LinearLayout>
(3)自定义适配器
eg:
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){ Fruit fruit = getItem(position); View view;// = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); ViewHolder viewHolder; if (convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); 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; viewHolder = (ViewHolder) view.getTag(); } viewHolder.fruitName.setText(fruit.getName()); viewHolder.fruitImage.setImageResource(fruit.getImageId()); 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; } class ViewHolder{ ImageView fruitImage; TextView fruitName; } }
4.提升ListView运行效率
(1)影响性能的原因:getView每次都将布局加载一次,效率低下
(2)解决方法:利用getView的convertView参数,该参数可以对之前加载过得布局文件缓存
eg:
if (convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); } else { view = convertView; }
(3)影响效率的第二个因素:getView调用findViewById()获取控件的实例
(4)消除方法:借助内部类ViewHolder,用于存储控件的实例
eg:
ViewHolder viewHolder; if (convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); 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; viewHolder = (ViewHolder) view.getTag(); } viewHolder.fruitName.setText(fruit.getName()); viewHolder.fruitImage.setImageResource(fruit.getImageId()); 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;
5.对ListView子项添加监听事件
ListView listView = (ListView) findViewById(R.id.list_view); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show(); } });