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

  • 相关阅读:
    Httpd服务入门知识-Httpd服务常见配置案例之显示服务器版本信息
    破解CentOS7的root及加密grub修复实战
    Httpd服务入门知识-Httpd服务安装
    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
    Linux操作系统-CentOS7启动流程和服务管理
    Socket网络编程-IO各种概念及多路复用
    Socket网络编程-SocketServer
    Socket网络编程-UDP编程
    Socket网络编程-TCP编程
    Linux操作系统内核编译之NTFS文件系统模块支持案例
  • 原文地址:https://www.cnblogs.com/edwardru/p/5891637.html
Copyright © 2020-2023  润新知