Listview实现的方法

第一种方法:

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对象,

posted @ 2016-09-21 10:10  EdwardRu  阅读(142)  评论(0编辑  收藏  举报