• android 适配器 BaseAdapter 的学习


    昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类。事实上通过源码可以看到,ArayAadapter和SimpleAdapter 都是继承自BaseAdapter的,前面两种大多数只是对信息的显示,Simple能够对复杂的信息进行显示,而如果需要用到响应,就只能自定义适配器了。所以同样我们可以继承BaseAdapter来实现自定义适配器

          一,实现自定义的MyAdapter

               当继承自BaseAdapter之后,编译器会自动提示需要该类需要实现的方法,getCount(),getItem(),getItemId(),getView().只需要重载这些抽象方法,实现功能即可。下面是一个小demo ,用来绑定一个TextView  和一个Buttton。前三个重载函数都好理解,重点getView。第一个参数position应该是视图的索引,第二个参数刚开始不是很清楚,但是按照字面意思是转变view,看了下网上的大神教程。是将一个自定义layout转变成view,其中用到了LayoutInflater 这样一个类。实在看不懂继续百度,如下:

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

    具体作用:

    1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

    2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

    这样的话,那就简单多了,只需要拿到view 取到控件,然后给控件设置值即可。

    还有一点看的不是很明白,就是在获取view 的时候,先去判断convertView是否为null,如果为null那么就创建view。

    首先去判断convertView是否为null,当其为null的时候,才去重新创建一个view,不是的话,就直接用convertView。那么这个convertView是什么东西呢?其实它就是刚刚离开屏幕的那个View,所以我们可以复用它,这样我们就可以极大极大地减少这个view的创建。

    这一点,可以说极大地优化了这个listView的性能,尤其是我们在加载图片这种很耗内存的资源的时候,这个效果更加明显。 不过这还不够,因为获得这个view之后,每次还需要通过 view.findViewById 来获得view里面的控件,findViewById的成本也是非常之高的,那么有什么办法呢? 一般来说,就是ViewHolder的应用了。

    我们可以在从view中获得的这几个控件放到一个viewHolder的对象中,并将其设置给view的Tag属性,这样下一次再重复利用这个view的时候,就不必再通过findViewById来获得控件 ,而是可以直接通过viewHolder来获得对应的控件。

    同时也给button添加相应函数

    public class MyAdapter extends BaseAdapter{
        private Context context;
        private List<String> list;
        private LayoutInflater mInflater;
        public MyAdapter(Context context,List<String> list){
    
            this.mInflater = LayoutInflater.from(context);
            this.context = context;
            this.list = list;
        }
        @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) {
    
            TextView textView=null;
            Button btn=null;
            ViewHold viewHold =null;
            if(convertView==null){
    
                viewHold = new ViewHold();
                convertView = mInflater.inflate(R.layout.baseitemlayout,null);
                viewHold.textView = (TextView)convertView.findViewById(R.id.textView3);
                viewHold.btn = (Button)convertView.findViewById(R.id.button3);
                convertView.setTag(viewHold);
            }
            else{
                viewHold =(ViewHold) convertView.getTag();
            }
            viewHold.textView.setText(list.get(position));
            viewHold.btn.setText("按钮");
            viewHold.btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"按钮",Toast.LENGTH_LONG).show();
                }
            });
            return convertView;
        }
        public class  ViewHold{
            public TextView textView;
            public Button btn;
        }
    }

     自定义的baseitemlayout.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"
        android:layout_weight="1">
    
        <TextView
            android:layout_weight="0.6"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:text="New Text"
            android:id="@+id/textView3" />
    
        <Button
            android:focusable="false"
            android:layout_weight="0.4"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:text="New Button"
            android:id="@+id/button3" />
    </LinearLayout>
    二 创建activity
    
    
    public class BaseAdapterActivity extends Activity {
    
        private MyAdapter adapter;
        private List<String> list;
        private ListView listView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_base_adapter);
            listView = (ListView)findViewById(R.id.listView4);
            list = new ArrayList<String>();
            adapter = new MyAdapter(this,getData());
            listView.setAdapter(adapter);
        }
        List<String> getData(){
            list.add("第一行");
            list.add("第二行");
            list.add("第三行");
            list.add("第四行");
            return list;
        }
    }
     

     上面的代码实现可能会出现 button 虽然可以点击,也会有响应事件,但是listview 不能点击了,这个还需要添加两行代码,并且添加listview响应函数

    在<RelativeLayout>中

    android:descendantFocusability="blocksDescendants"

    和<Button>中

    android:focusable="false"

    为了弄明白,网上资料查了好多,不过还好总算是实现了。
  • 相关阅读:
    洛谷P3799 妖梦拼木棒
    bzoj1008 [HNOI2008]越狱
    洛谷P3414 SAC#1
    洛谷P1078 文化之旅
    bzoj1053 [HAOI2007]反素数ant
    洛谷P1588 丢失的牛
    bzoj1085 [SCOI2005]骑士精神
    noip2016 蚯蚓
    noip2016 换教室
    html笔记03:表单
  • 原文地址:https://www.cnblogs.com/techdreaming/p/4927653.html
Copyright © 2020-2023  润新知