Android之ListView学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fu_17791654327/article/details/79524478

ListView

属性方法介绍:

  常用属性:
    listSelector:listView每项在选中、按下等不同状态时的Drawable
    divider :ListView每项间的间隔Drawable
    dividerHeight :ListView每项间间隔的间隔高度
    drawSelectorOnTop(AbsListView中的方法):默认值为false,如果为true则ListView中选中的列表项将会显示在上面
    
  常用方法:
    setAdapter() : 设置数据适配器
    setOnItemClickListener():设置子条目点击事件
    addHeaderView(): 添加头视图
    addFooterView() :添加尾视图
    setEmptyView() :设置数据项为0时的空数据视图

使用一:

  • 1.布局中添加ListView控件,代码中初始化
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/lv_array"
        android:divider="#ffaa00"
        android:dividerHeight="2dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_array);
        ListView mLvArray = (ListView) findViewById(R.id.lv_array);
    }

  • 2.初始化适配器
 String[] array = {"张三","张四","张五","张六","张七","张八","张九","李四","李五","王五","王六","王七","王八"};
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,array);
  • 3.绑定适配器
mLvArray.setAdapter(arrayAdapter);

使用SimpleAdapter和ArrayAdapter类似,此处不做赘述。下面看看BaseAdapter的使用。

使用二:

  • 1.布局中添加ListView控件,代码中初始化,与上面相同。

  • 2.初始化适配器

 BaseAdapter baseAdapter = new BaseAdapter() {
            //  列表子项数量
            @Override
            public int getCount() {
                return 50;
            }

            // 第position处的列表项内容
            @Override
            public Object getItem(int position) {
                return null;
            }

            // 第position处的列表项id
            @Override
            public long getItemId(int position) {
                return position;
            }

            // 第position处的列表项组件
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                // 自定义布局
                convertView = BaseActivity.this.getLayoutInflater().inflate(R.layout.lvi_simple, null);
                // 获取自定义布局中的组件
                ImageView ivLviTitle = convertView.findViewById(R.id.iv_lvi_simple_title);
                TextView tvLviName = convertView.findViewById(R.id.tv_lvi_simple_name);
                TextView tvLviDesc = convertView.findViewById(R.id.tv_lvi_simple_desc);
                // 设置数据
                ivLviTitle.setImageResource(R.drawable.xian);
                tvLviName.setText("第 " + position + " 个列表项");
                tvLviDesc.setText("第 " + position + " 个列表项 说明");

                return convertView;
            }
        };
  • 3.绑定适配器
mLvBase.setAdapter(baseAdapter);

适配器优化:

    // 优化一:每次获取view时进行判断,convertView是否为空,是,则创建视图;否,则使用已经消失的视图(条目view);
    //         然后设置数据。
    // 优化二:使用静态内部类(ViewHolder)将视图中的控件保存起来,每次只需要从ViewHolder中获取就可以,
    //         不再通过findViewById方法去获取。
    BaseAdapter baseAdapter = new BaseAdapter() {
        //  列表子项数量
        @Override
        public int getCount() {
            return 50;
        }

        // 第position处的列表项内容
        @Override
        public Object getItem(int position) {
            return null;
        }

        // 第position处的列表项id
        @Override
        public long getItemId(int position) {
            return position;
        }

        // 第position处的列表项组件
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder = null;

            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = BaseActivity.this.getLayoutInflater().inflate(R.layout.lvi_simple, null);
                viewHolder.ivLviTitle = convertView.findViewById(R.id.iv_lvi_simple_title);
                viewHolder.tvLviName = convertView.findViewById(R.id.tv_lvi_simple_name);
                viewHolder.tvLviDesc = convertView.findViewById(R.id.tv_lvi_simple_desc);
                // 使用setTag方法将convertView和viewHolder关联起来
                convertView.setTag(viewHolder);
            }else {
                // 当convertView不为空时,使用getTag方法获取到已有的组件
                viewHolder = (ViewHolder) convertView.getTag();
            }

            viewHolder.ivLviTitle.setImageResource(R.drawable.xian);
            viewHolder.tvLviName.setText("第 " + position + " 个列表项");
            viewHolder.tvLviDesc.setText("第 " + position + " 个列表项 说明");

            return convertView;
        }
    };

    static class ViewHolder {
        ImageView ivLviTitle;
        TextView tvLviName;
        TextView tvLviDesc;
    }

适配器封装:

    /**
     * BaseAdapter
     *
     * @param <T>
     */
    abstract class BaseAdapter<T> extends android.widget.BaseAdapter {

        private LayoutInflater inflater;
        private List<T> mList;
        private Context mContext;

        public BaseAdapter(Context context, List<T> list) {
            this.mContext = context;
            this.mList = list;
            this.inflater = LayoutInflater.from(context);
        }


        @Override
        public int getCount() {
            return mList.size() == 0 ? 0 : mList.size();
        }

        @Override
        public Object getItem(int position) {
            return mList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }


    }

ListView多布局适配器实现:

public class BAParticularsProcessAdapter extends BaseAdapter {

    LayoutInflater inflater;
    final int TYPE_1 = 0;
    final int TYPE_2 = 1;
    private List<Process> mList;
    private Context mContext;

    public BAParticularsProcessAdapter(Context context, List<Process> list) {
        this.mContext = context;
        this.mList = list;
    }



    @Override
    public int getViewTypeCount() {
        // 不同布局样式数量
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        // 不同布局样式分配规则
        if (position==0) {
            return TYPE_1;
        } else {
            return TYPE_2;
        }

    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder1 holder1 = null;
        ViewHolder2 holder2 = null;
        int type = getItemViewType(position);
        if (convertView == null) {
            inflater = LayoutInflater.from(mContext);
            switch (type) {
                case TYPE_1:
                    convertView = inflater.inflate(R.layout.list_view_item_one, parent, false);
                    holder1 = new ViewHolder1();
                    holder1.mTvLvItemOne = (TextView) convertView.findViewById(R.id.tv_lv_item_user_one);
                    holder1.mTvLvItemTimeOne = (TextView) convertView.findViewById(R.id.tv_lv_item_time_one);
                    holder1.mCivLvItemOne = (ImageView) convertView.findViewById(R.id.civ_lv_item_one);

                    convertView.setTag(holder1);
                    break;
                case TYPE_2:
                    convertView = inflater.inflate(R.layout.list_view_item_two, parent, false);
                    holder2 = new ViewHolder2();
                    holder2.mTvLvItemTwo = (TextView) convertView.findViewById(R.id.tv_lv_item_two);
                    holder2.mTvLvItemTimeTwo = (TextView) convertView.findViewById(R.id.tv_lv_item_time_two);
                    holder2.mCivLvItemTwo = (ImageView) convertView.findViewById(R.id.civ_lv_item__two);
                    convertView.setTag(holder2);
                    break;

            }

        } else {
            switch (type) {
                case TYPE_1:
                    holder1 = (ViewHolder1) convertView.getTag();
                    break;
                case TYPE_2:
                    holder2 = (ViewHolder2) convertView.getTag();
                    break;

            }
        }
        switch (type) {
            case TYPE_1:
                holder1.mTvLvItemOne.setText(
                        mList.get(position).getUname() + mList.get(position).getAcname() + "  --  typeOne  " + (position + 1));
                holder1.mTvLvItemTimeOne.setText(mList.get(position).getTime());

                if (TextUtils.isEmpty(mList.get(position).getUface())) {
                    holder1.mCivLvItemOne.setImageResource(R.drawable.ic_account_circle_black_24dp);
                } else {
                    Glide.with(mContext).load(mList.get(position).getUface()).into( holder1.mCivLvItemOne);
                }

                break;
            case TYPE_2:
                holder2.mTvLvItemTwo.setText(
                        mList.get(position).getUname() + mList.get(position).getAcname() + "  --  typeTwo  " + (position + 1));
                holder2.mTvLvItemTimeTwo.setText(mList.get(position).getTime());
                if (TextUtils.isEmpty(mList.get(position).getUface())) {
                    holder2.mCivLvItemTwo.setImageResource(R.drawable.ic_account_circle_black_24dp);
                } else {
                    Glide.with(mContext).load(mList.get(position).getUface()).into( holder2.mCivLvItemTwo);
                }
                break;

        }
        return convertView;

    }

    public static class ViewHolder1 {
        TextView mTvLvItemOne;
        TextView mTvLvItemTimeOne;
        ImageView mCivLvItemOne;
    }

    public static class ViewHolder2 {
        TextView mTvLvItemTwo;
        TextView mTvLvItemTimeTwo;
        ImageView mCivLvItemTwo;
    }


}

猜你喜欢

转载自blog.csdn.net/fu_17791654327/article/details/79524478