Android控件之高级控件——ListView、cardView、屏幕适配

简介: Android控件之高级控件——ListView、cardView、屏幕适配

一:ListView

 

1.什么是ListView

如下通过一行行列表视图展示数据的一种控件,应用场景比如通讯录、短信列表、聊天联系人、文件夹列表、评论列表、应用列表等

2.Layout中如何实现ListView

第一步:layout中创建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"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

效果

第二步:创建每一行的Layout。item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:id="@+id/list_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="30dp"
        android:paddingTop="12dp"
        android:text="今天是个好日子"
        android:textSize="24dp" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24dp"
        android:text="阅读原文"
        android:layout_marginLeft="90dp"/>
</LinearLayout>

效果

第三步:使用adapter将数据填充到每一行的视图中

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = findViewById(R.id.list_item);
        List<String> list = new ArrayList<>();
        list.add("Android知识了解");
        list.add("Android开发环境搭建");
        list.add("Android控件学习");
        list.add("Android网络操作");
        listView.setAdapter(new ListAdapter(list));
    }
 
    public class ListAdapter extends BaseAdapter {
        List<String> names;
 
        public ListAdapter(List<String> list) {
            names = list;
        }
 
        @Override
        public int getCount() {//有多少条数据
            return names.size();
        }
 
        @Override
        public Object getItem(int position) {//获取当前postion位置的这条数据
            return names.get(position);
        }
 
        @Override
        public long getItemId(int position) {//获取当前postion位置的id
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //xml转成java代码操作
            LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.item, null);
            TextView textView = convertView.findViewById(R.id.item_text);
            Button button = convertView.findViewById(R.id.button);
            textView.setText(names.get(position));
            return convertView;
        }
    }
}

效果

3.给ListView添加头部Header

我们要实现的需求如下,当我们向上翻动时候,顶部也会滚动

要实现以上的header效果,主要用到的方法就是ListView的addHeaderView(View view),需要一个view对象,所以我们创建一个header.xml的layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@mipmap/header"
        />
</LinearLayout>

效果

java代码,只需在3中代码的onCreate方法加上以下代码

//读取layout转成View
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View header= layoutInflater.inflate(R.layout.header, null);
listView.addHeaderView(header);

注:如果要实现翻滚列表但是顶部图片不随着翻动效果,我们只需将界面设计成顶部一个ImageView控件加上下面一个ListView控件

4.通过ListView展示手机所有应用列表

我们要实现的需求如下所示,展示所有应用列表,并且点击能够进入当前应用

这里每行的layout的xml文件发生了点变化,代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
 
 
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24dp"
        android:text="阅读原文"
        android:layout_marginLeft="10dp"
       />
    <TextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="30dp"
        android:paddingTop="12dp"
        android:text="今天是个好日子"
        android:textSize="24dp" />
</LinearLayout>

整个java代码如下

 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = findViewById(R.id.list_item);
        final List<ResolveInfo> list = getAppInfos();
        listView.setAdapter(new ListAdapter(list));
        //添加每个item的点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String packageName = list.get(position).activityInfo.packageName;
                String className = list.get(position).activityInfo.name;
                ComponentName componentName = new ComponentName(packageName, className);
                final Intent intent = new Intent();
                intent.setComponent(componentName);
                startActivity(intent);
            }
        });
    }
 
 
    public class ListAdapter extends BaseAdapter {
        List<ResolveInfo> names;
 
        public ListAdapter(List<ResolveInfo> list) {
            names = list;
        }
 
        @Override
        public int getCount() {//有多少条数据
            return names.size();
        }
 
        @Override
        public Object getItem(int position) {//获取当前postion位置的这条数据
            return names.get(position);
        }
 
        @Override
        public long getItemId(int position) {//获取当前postion位置的id
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //xml转成java代码操作
            LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.item, null);
            TextView textView = (TextView) convertView.findViewById(R.id.item_text);
            ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
            textView.setText(names.get(position).activityInfo.loadLabel(getPackageManager()));
            imageView.setImageDrawable(names.get(position).activityInfo.loadIcon(getPackageManager()));
            return convertView;
        }
    }
 
    //获取所有的应用信息
    private List<ResolveInfo> getAppInfos() {
        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        return getPackageManager().queryIntentActivities(intent, 0);
    }
}

 

5.优化ListView

我们上面实现的ListView缺点就是如果数据很多的时候,我们每次翻动都会加载每个item进行渲染,我们可以通过缓存当前这个item达到优化

具体修改的代码如下

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    if(convertView==null){
        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.item, null);
        holder.textView  = (TextView) convertView.findViewById(R.id.item_text);
        holder.imageView  = (ImageView) convertView.findViewById(R.id.image);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder)convertView.getTag();
    }
    holder.textView.setText(names.get(position).activityInfo.loadLabel(getPackageManager()));
    holder.imageView .setImageDrawable(names.get(position).activityInfo.loadIcon(getPackageManager()));
    return convertView;
}
public  class ViewHolder{
    public TextView textView;
    public ImageView imageView;
}

 

二:CardView

 

1.CardView是什么?

CardView是Android5.0之后新增的一个继承自FrameLayout,方便作为其他控件容器添加3D阴影和圆角效果,使用的时候需要独立引入com.android.support:cardview-v7:26.1.0

如下效果

2.CardView常用属性

app:cardBackgroundColor背景色

app:cardCornerRadius圆角半径

app:contentPadding内容padding

app:cardElevation阴影大小

cardUseCompatPadding 默认false,用于5.0以上,true则添加额外的padding绘制阴影

cardPreventCornerOverlap 默认true 用于5.0以下,添加额外padding防止内容和圆角重叠

 

 

三:屏幕适配

 

让我们的app使用不同尺寸、不同分辨率的设备,完成屏幕适配主要包括布局上的适配和图片上的适配

几个概念

屏幕尺寸:是屏幕对角线的长度单位是英寸,1英寸=2.54厘米,常见尺寸2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0

屏幕分辨率:指在横纵向上像素点数,单位是px,1px=1个像素点,一般以纵向像素*横向像素如1960*1080

屏幕像素密度:尺寸不变的情况下,分辨率越高屏幕越清晰屏幕像素密度越高,即屏幕像素密度指的是每英寸上的像素点数单位是dpi(求法就是首先根据三角形求出对角线上的像素,然后除以屏幕尺寸即可),

dp的范围划分

 

布局适配

1.禁用绝度布局

2.少用px作为单位,改用dp或者dip

3.合理使用wrap_content(先按照内容的多少设定控件大小,再按照权重比例分配)、match_parent(控件大小=父容器大小+权重比例*剩余空间大小)、layout_weight(0dp,直接按照你所设定比例分配)

图片适配

1.提供不容分辨率的图

2.使用自动拉伸图

 

文章首发地址:www.javayihao.top

文章首发公众号:java一号

 


相关文章
|
2月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
45 0
|
3月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
57 3
|
4月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
6月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
73 2
|
6月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
225 2
|
5月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
48 0
|
6月前
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍
|
6月前
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
140 0
|
Android开发
Xamarin android CardView的使用详解
android 5.0新增加的一个控件CardView,在support v7兼容包中,意思就是卡片View,虽然可以设置阴影,圆角等等样式,但是我们也可以自己写出来,谷歌工程师之所以出这个,肯定是帮我们做了很多事情,在性能和兼容性各方面还是做了工作的。
1321 0
|
19天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19