ListView-BaseAdapter
2016-04-21 01:12
489 查看
1、 首先需要有两个布局文件,一个是主布局,用来放ListView,另一个用来作为ListView的Item中的布局。
vitem.xml
2、新建一个类MyClass来存放vitem布局里每个组件的内容
3、在活动中把每个item中组件的内容存入一个List中,类型为MyClass
MainActivity
4.、新建一个类继承BaseAdapter,并重写里面的getCount、getItem、getItemId、getView方法
上面的getView方法是效率最低的写法,getView还可以进行优化。
主要是对LayoutInflater.form(context).inflate(R.layout.item)
和findViewById的优化,第一次加载后存放到一个对象中,第二次直接使用该对象中存放的内容。
vitem.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="match_parent" android:orientation="horizontal"> <ImageView android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/imageView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/textView" android:paddingTop="20dp" android:paddingLeft="20dp"/> </LinearLayout>
2、新建一个类MyClass来存放vitem布局里每个组件的内容
public class MyClass { String text; int image; public MyClass(String text,int image){ this.text=text; this.image=image; } }
3、在活动中把每个item中组件的内容存入一个List中,类型为MyClass
MainActivity
public class MainActivity extends Activity { MyClass myClass; ListView listView; List<MyClass> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.listView); list=new ArrayList<>(); //这里通过循环创建MyClass对象,每个对象存放每个item中组件内容,并添加到一个List中,注:这里我的每个item内容都是相同 for(int i=0;i<10;i++){ myClass=new MyClass("text",R.drawable.youtube); list.add(myClass); } listView.setAdapter(new MyAdapter(MainActivity.this,list)); } }
4.、新建一个类继承BaseAdapter,并重写里面的getCount、getItem、getItemId、getView方法
public class MyAdapter extends BaseAdapter { private LayoutInflater inflater; private List<MyClass> list; public MyAdapter(Context context2,List<MyClass> list2){ inflater=LayoutInflater.from(context2); this.list=list2; }; @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //首先使用找到context加载其中的item的布局,获得一个View对象 View view=inflater.inflate(R.layout.vitem,null); //获得item布局的View对象后就可以找到其中的组件 ImageView image=(ImageView)view.findViewById(R.id.imageView); TextView text=(TextView)view.findViewById(R.id.textView); //ListView中存放了MyClass类实例,MyClass类实例中又有存放ImageView的id的变量和存放要付给TextView的字符串,position是一个下标 MyClass myClass=list.get(position); //设置组件 image.setImageResource(myClass.image); text.setText(myClass.text); return view; } }
上面的getView方法是效率最低的写法,getView还可以进行优化。
主要是对LayoutInflater.form(context).inflate(R.layout.item)
和findViewById的优化,第一次加载后存放到一个对象中,第二次直接使用该对象中存放的内容。
public view getView(int position,View convertView,ViewGroup parent){ View view; ViewHolder viewHolder; MyClass myClass=list.get(position); //判断convertView是否为空,当布局第一次加载时为空 if(convertView==null){ view=inflater.inflate(R.layout.vitem,null); viewHolder=new viewHolder(); //第一次加载时把组件存放到ViewHolder中 viewHolder.imageView=(ImageView)findViewById(R.id.imageView); viewHolder.textView=(TextView)findViewById(R.id.textView); view.setTag(viewHolder); }else{ view=convertView; viewHolder=(ViewHolder)view.getTag(); } viewHolder.imageView.setImageResource(myClass.image); viewHolder.textView.setText(myClass.text); return view; } Class ViewHolder(){ ImageView imageView; TextView textView; }
相关文章推荐
- 数据库性能优化之SQL语句优化
- 使Datawindow每页打印固定行
- (八)STM32的CAN模块实验
- tungsten-replicator
- 四月排名赛
- 开源CMS系统Moodle对比中国本土化开源在线教育平台EduSoho
- 关于html5之canvas的那些事
- java编程中的性能提升问题
- MSDN 提供的有关 Windows Communication Foundation (WCF) 的各个方面的示例说明
- maven pom.xml详解
- Eclipse JEE中Server Options作用
- 使用AndroidEventBus
- robotframework笔记19
- 数据结构之算法特性及分类
- DevExpress GridControl 列中显示图片
- mysql5.7在多列索引 in条件查询的优化
- (七)STM32的RTC简单操作
- (六)STM32的时钟系统
- Android必知必会-Fragment监听返回键事件
- Android必知必会-Fragment监听返回键事件