第一种方法:
Activity代码
public class MainActivity extends AppCompatActivity { private List<Itembean> mlist; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mlist= new ArrayList<Itembean>(); for(int i=0;i<10;i++){ mlist.add(new Itembean(R.mipmap.ic_launcher,"我是标题"+i)); } Myadapter myadapter=new Myadapter(this,mlist); listView=(ListView)findViewById(R.id.listview); listView.setAdapter(myadapter); } }
自定义一个适配器
public class Myadapter extends BaseAdapter { private List<Itembean > mlist; private LayoutInflater layoutInflater; public Myadapter(Context context, List<Itembean> mlist){ //加载布局管理器调用Context.getSystemService() this.layoutInflater=LayoutInflater.from(context); this.mlist=mlist; } @Override public int getCount() { return mlist.size(); } @Override public Object getItem(int i) { return mlist.get(i); } @Override public long getItemId(int i){ return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { //将layout文件转化为view的实例 View view1 = layoutInflater.inflate(R.layout.item,null); ImageView imageview=(ImageView)view1.findViewById(R.id.image222); TextView textview=(TextView) view1.findViewById(R.id.text222); //得到list中的每个position下的Itembean的对象,并从对象中获得所对应的resource,获得标题和图像 Itembean bean=mlist.get(i); imageview.setImageResource(bean.imageid); textview.setText(bean.titleid); return view1; } }
在自定义Adapter之中,需要将layout文件转化为view对象,通过view的对象找到其中的控件如textview或者是imageview,将每一个list中所存放的图片和text都加载到
image和text之中
最后listview加载adapter实现,所想要实现的效果。
*****************************************************
第二种方法(优化adapter)
public class Myadapter extends BaseAdapter { private List<Itembean > mlist; private LayoutInflater layoutInflater; public Myadapter(Context context, List<Itembean> mlist){ //加载布局管理器调用Context.getSystemService() this.layoutInflater=LayoutInflater.from(context); this.mlist=mlist; } @Override public int getCount() { return mlist.size(); } @Override public Object getItem(int i) { return mlist.get(i); } @Override public long getItemId(int i){ return i; } @Override //convertview为在listview中的Android自动缓存所保存的view public View getView(int i, View convertview, ViewGroup viewGroup) { ViewHolder viewHolder; if(convertview==null){ /* * 当所缓存的convertview为空时创建viewHolder对象,通过viewholder封装好的对象 * findviewbyid找到所需要的控件 * * */ viewHolder=new ViewHolder(); convertview=layoutInflater.inflate(R.layout.item,null); viewHolder.imageView=(ImageView)convertview.findViewById(R.id.image222); viewHolder.textView=(TextView)convertview.findViewById(R.id.text222); convertview.setTag(viewHolder); }else { //当所缓存的convertview不为空的时候直接用getTag调用所缓存的viewholder对象((在convertview中已经关联了view中的控件))封存在viewHolder之中) viewHolder=(ViewHolder)convertview.getTag(); } //设置所需要加载的list中的文件,已经通过mlist.get()方法的得到了ItemBean的对象 Itembean itembean=mlist.get(i); viewHolder.textView.setText(itembean.titleid); viewHolder.imageView.setImageResource(itembean.imageid); return convertview; } //设置内部类viewholder封装所需要使用的控件 class ViewHolder{ public ImageView imageView; public TextView textView; } }
在这个优化的方法之中
第一是:设置了一个内部类viewholder直接封装了viewholder所需要的控件,不用每一次都调用。
在convertview为空的时候:
这样每一个为空的convertview会将它的控件保存在viewholder这样的一个控件之中,这样我们通过settag方法就可以快速的找到一个converview中所包含的viewholder对象也就是image和text的对象,从而避免了通过findviewbyid的方法去实例化
convertview不为空的时候:
在convertview不为空的时候就可以直接通过convertview的一个gettag方法取出所关联的viewholder对象,令
viewholder=(ViewHolder)convertview.gettag();
//settag的作用:绑定数据,特别是绑定数据到view。而且可以用getTag()取得,很方便,而且是任意类型的数据
//使用settag方法将viewholder与convertview进行关联,这样每一个为空的convertview会将它的控件保存在viewholder这样的一个控件之中,这样我们通过settag方法就可以快速的找到一个converview中所包含的viewholder对象也就是image和text的对象,从而避免了通过findviewbyid的方法去实例化(减少浪费的内存)
在convertview不为空的时候就可以直接通过convertview的一个gettag方法取出所关联的viewholder对象啊,令
viewholder=convertview.gettag();
通过viewholder来找到imageview对象,