• Android 列表视图ListView 基本适配器BaseAdapter具体使用方法(附参考代码)


    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助

    • 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时)

    Android中Adapter类其实就是把数据源绑定到指定的View上,然后再返回该View,而返回来的这个View就是ListView中的某一行item。这里返回来的View正是由我们的Adapter中的getView方法返回的。这样就会容易理解数据是怎样一条一条显示在ListView 中的。

    简单的ListView可使用ArrayAdapter和SimpleAdapter两种适配器。其中, ArrayAdapter适用于纯文本的列表数据,SimpleAdapter适用于带图标的列表数据。实际应用中常常有更复杂的列表,比如同一项中存在多个控件,这种情况即使用SimpleAdapter也很吃力,而且不易扩展。基于此, Android提供了一种适应性更强的基本适配器BaseAdapter,该适配器允许开发者在别的代码文件中进行逻辑处理,大大提高了代码的可读性和可维护性。

    • step1:创建列表单行的布局

    新建一个layout,和普通的layout文件差不多,只不过这个文件设置的是ListView单项的样式。

    例如:item_layout.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="wrap_content"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textview_date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:visibility="visible" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">
    
            <ImageView
                android:id="@+id/image_time"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="0.5" />
    
            <TextView
                android:id="@+id/textview_time"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:textAppearance="@style/TextAppearance.AppCompat.Large" />
        </LinearLayout>
    
    </LinearLayout>
    • step2:实现BaseAdapter的基本方法

    写一个新的适配器继承BaseAdapter,从BaseAdapter派生的数据适配器主要实现下面几个方法。

    • 构造函数:指定适配器需要处理的数据集合。
    • getCount:获取数据项的个数。
    • getView:获取每项的展示视图,并对每项的内部控件进行业务处理。
    • getItem:数据集中指定索引对应的数据项。

    例如:

    public class MyListAdapter extends BaseAdapter {
        Context context;
        List<p_data> data;    //数据源
    int layout; //Item布局 public MyListAdapter(Context context, int layout ,List<p_data> data){ this.context=context; this.layout=layout; this.data=data; } /** * 这里的getCount方法是程序在加载显示到ui上时就要先读取的 * 这里获得的值决定了listview显示多少行 * 实际应用中此处的返回值是由从数据库中查询出来的数据的总条数 */ @Override public int getCount() { return data == null ? 0 : data.size(); } /** * 根据ListView所在位置返回View * @param position * @return 选中的数据 */ @Override public Object getItem(int position) { Nbp_data Nbp_choosen_data=data.get(position); //return Nbp_choosen_data == null ? null : data.get(position); return Nbp_choosen_data; } /** * 根据ListView位置得到数据源集合中的Id * @param position * @return */ @Override public long getItemId(int position) { return position; } /** * 重写adapter最重要的就是重写此方法,此方法也是决定listview界面的样式的 * @param position * @param convertView * @param parent * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView_time; TextView textView_time; TextView textView_date; final p_data record_data=data.get(position); if (convertView == null) { convertView= LayoutInflater.from(context).inflate(layout,null); }else { } imageView_time= (ImageView) convertView.findViewById(R.id.image_time); textView_time= (TextView) convertView.findViewById(R.id.textview_time); textView_date= (TextView) convertView.findViewById(R.id.textview_date); imageView_time.setImageResource(record_data.getTimeImage()); textView_date.setText(record_data.getDATE()); textView_time.setText(record_data.getTIME()); return convertView; } }

    拓展:使用ViewHolder模式提高效率

    在列表单行控件比较多的时候,ViewHolder方法可大幅度优化ListView的滑动。

    • step3:在Activity或Fragment中与ListView绑定

    例如:

            //在fragment的onCreateView()中
            MyListAdapter myListAdapter=new MyListAdapter(root.getContext(),R.layout.item_layout,recorded_data);
            ListView listView=(ListView)root.findViewById(R.id.lv_recordedData);
            listView.setAdapter(myListAdapter);    
    
            //设置事件监听
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                    p_data choosen_data = (p_data)arg0.getItemAtPosition(arg2);
                    int date = choosen_data.getDATE();
                    int time = choosen_data.getTIME();
    } }); // //长按事件监听
    // listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
    // @Override // public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){ // return true; // } // });

    参考:

    《Android Studio开发实战:从零基础到App上线》 欧阳燊  清华大学出版社

    BaseAdapter的使用方法介绍 https://blog.csdn.net/RIPNDIP/article/details/79693666

    Android中Adapter之BaseAdapter使用 

  • 相关阅读:
    oracle实验13:单行函数-数字函数
    oracle实验12:单行函数-字符函数
    oracle实验41:编写存储过程
    oracle实验40:编写函数
    oracle实验31:使用PL/SQL,书写一个最简单的块
    oracle实验9-11:使用where和order by子句
    oracle实验6-8:关于null值,列的别名,去掉重复行
    oracle实验5:查询当前用户的所有表和视图
    MD5
    时间戳 日期 转换
  • 原文地址:https://www.cnblogs.com/XIEjm/p/12813935.html
Copyright © 2020-2023  润新知