zoukankan      html  css  js  c++  java
  • Android 适配器

     Adapter是连接后端数据和前端显示的桥梁,是数据和UI(View)之间的纽带。
        在常见的View(ListView,GridView)等地方都需要用到Adapter。数据、Adapter和View之间的关系如下:
        常见的适配器有以下几种:
    • BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
    • SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
    • ArrayAdapter:支持泛型操作,最为简单,只能展示一行字。
    • SimpleCursorAdapter:可以适用于简单的纯文字型ListView,也可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
        从源码上分析,其它类都是继承了BaseAdapter类,继承该类可以实现的功能最丰富,继承它需要实现以下四个方法:
    • getCount():得到数据的行数,也可以控制item的数量
    • getItem(int position):根据positon得到某一行的记录
    • getItemId(int postion):得到某一条记录的ID
    • getView(int position, View cnverView, ViewGroup parent):最重要的一个方法,重点介绍。功能是定义适配器以什么样的方式显示我们填充的数据,参数介绍如下,
        position表示将显示的是第几行,converView是从布局文件(List中item的布局)中inflate来的,parent表示此视图最终会被附加到的父级视图。经典示例如下:
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    LayoutInflater inflater = (LayoutInflater)MyListView.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    View itemView = inflater.inflate(R.layout.item, null);
                    TextView title = (TextView)itemView.findViewById(R.id.itemTitle);
                    title.setText(itemTitles[position]);
                    return itemView;
                } else {
                    TextView title = (TextView)convertView.findViewById(R.id.itemTitle);
                    title.setText(itemTitles[position]);
                    return convertView;
                }
            }

    通过视图缓存机制优化,适配器的完整代码如下:

    public class ViewHolderAdapter extends BaseAdapter {
        private List<String> mData;
        private LayoutInflater mInflater;
    
        public ViewHolderAdapter(Context context, List<String> data){
            this.mData=data;
            mInflater=LayoutInflater.from(context);
        }
        
        @Override
        public int getCount() {
    // TODO Auto-generated method stub,控制只显示3个item
            return mData.size() > 3 : 3 : mData.size;
        }
    
        @Override
        public Object getItem(int position) {
    // TODO Auto-generated method stub
            return mData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
    // TODO Auto-generated method stub
            return position;
        }
    
        public final class ViewHolder{
            public ImageView img;
            public TextView title;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
            ViewHolder holder=null;
            if(convertView==null){
                holder=new ViewHolder();
    
                convertView=mInflater.inflate(R.layout.viewholder_item,null);//填充自定义item
                holder.img=(ImageView)convertView.findViewById(R.id.imageView);
                holder.title=(TextView)convertView.findViewById(R.id.textView);
                convertView.setTag(holder);
            }else{
    //通过Tag找到缓存的布局
                holder=(ViewHolder)convertView.getTag();
            }
    
            holder.img.setBackgroundResource(R.drawable.one);
            holder.title.setText(mData.get(position));
    
            return convertView;
        }
    
    }

    最后在MainActivity中显示

    public class MainActivity extends Activity {
        private List<String> mData;
        private ViewHolderAdapter adapter;
        private ListView listview;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listview=(ListView) findViewById(R.id.listview);
            mData=new ArrayList<String>();
            for(int i=0;i<120;i++){
                mData.add(""+i);
            }
    
            adapter=new ViewHolderAdapter(this,mData);
            listview.setAdapter(adapter);
    
        }
    }

     程序猿必读

  • 相关阅读:
    ceph 手工部署
    zstack 搭建部署
    ceph crush
    mini2440动态加载hello.ko模块
    j-flash配置用于烧录mini 2440 nor flash
    (转载)PPP协议规范
    at91sam9263: 定时器
    cyg_io_read返回值是0,因为读到的字节长度在参数中
    read函数
    Linux编译错误:‘cout’在此作用域中尚未声明
  • 原文地址:https://www.cnblogs.com/longzhongren/p/6084967.html
Copyright © 2011-2022 走看看