当前位置:   article > 正文

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

cardview listview

一:ListView

 

1.什么是ListView

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

2.Layout中如何实现ListView

第一步:layout中创建ListView

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <ListView
  9. android:id="@+id/list_item"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"/>
  12. </LinearLayout>

效果

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:id="@+id/list_item"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_gravity="center_horizontal"
  10. android:layout_marginLeft="30dp"
  11. android:paddingTop="12dp"
  12. android:text="今天是个好日子"
  13. android:textSize="24dp" />
  14. <Button
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:textSize="24dp"
  18. android:text="阅读原文"
  19. android:layout_marginLeft="90dp"/>
  20. </LinearLayout>

效果

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

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. ListView listView = findViewById(R.id.list_item);
  7. List<String> list = new ArrayList<>();
  8. list.add("Android知识了解");
  9. list.add("Android开发环境搭建");
  10. list.add("Android控件学习");
  11. list.add("Android网络操作");
  12. listView.setAdapter(new ListAdapter(list));
  13. }
  14. public class ListAdapter extends BaseAdapter {
  15. List<String> names;
  16. public ListAdapter(List<String> list) {
  17. names = list;
  18. }
  19. @Override
  20. public int getCount() {//有多少条数据
  21. return names.size();
  22. }
  23. @Override
  24. public Object getItem(int position) {//获取当前postion位置的这条数据
  25. return names.get(position);
  26. }
  27. @Override
  28. public long getItemId(int position) {//获取当前postion位置的id
  29. return position;
  30. }
  31. @Override
  32. public View getView(int position, View convertView, ViewGroup parent) {
  33. //xml转成java代码操作
  34. LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  35. convertView = layoutInflater.inflate(R.layout.item, null);
  36. TextView textView = convertView.findViewById(R.id.item_text);
  37. Button button = convertView.findViewById(R.id.button);
  38. textView.setText(names.get(position));
  39. return convertView;
  40. }
  41. }
  42. }

效果

3.给ListView添加头部Header

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:layout_width="match_parent"
  7. android:layout_height="100dp"
  8. android:background="@mipmap/header"
  9. />
  10. </LinearLayout>

效果

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

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

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

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/image"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:textSize="24dp"
  10. android:text="阅读原文"
  11. android:layout_marginLeft="10dp"
  12. />
  13. <TextView
  14. android:id="@+id/item_text"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_gravity="center_horizontal"
  18. android:layout_marginLeft="30dp"
  19. android:paddingTop="12dp"
  20. android:text="今天是个好日子"
  21. android:textSize="24dp" />
  22. </LinearLayout>

整个java代码如下

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. ListView listView = findViewById(R.id.list_item);
  7. final List<ResolveInfo> list = getAppInfos();
  8. listView.setAdapter(new ListAdapter(list));
  9. //添加每个item的点击事件
  10. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  11. @Override
  12. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  13. String packageName = list.get(position).activityInfo.packageName;
  14. String className = list.get(position).activityInfo.name;
  15. ComponentName componentName = new ComponentName(packageName, className);
  16. final Intent intent = new Intent();
  17. intent.setComponent(componentName);
  18. startActivity(intent);
  19. }
  20. });
  21. }
  22. public class ListAdapter extends BaseAdapter {
  23. List<ResolveInfo> names;
  24. public ListAdapter(List<ResolveInfo> list) {
  25. names = list;
  26. }
  27. @Override
  28. public int getCount() {//有多少条数据
  29. return names.size();
  30. }
  31. @Override
  32. public Object getItem(int position) {//获取当前postion位置的这条数据
  33. return names.get(position);
  34. }
  35. @Override
  36. public long getItemId(int position) {//获取当前postion位置的id
  37. return position;
  38. }
  39. @Override
  40. public View getView(int position, View convertView, ViewGroup parent) {
  41. //xml转成java代码操作
  42. LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  43. convertView = layoutInflater.inflate(R.layout.item, null);
  44. TextView textView = (TextView) convertView.findViewById(R.id.item_text);
  45. ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
  46. textView.setText(names.get(position).activityInfo.loadLabel(getPackageManager()));
  47. imageView.setImageDrawable(names.get(position).activityInfo.loadIcon(getPackageManager()));
  48. return convertView;
  49. }
  50. }
  51. //获取所有的应用信息
  52. private List<ResolveInfo> getAppInfos() {
  53. Intent intent = new Intent(Intent.ACTION_MAIN, null);
  54. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  55. return getPackageManager().queryIntentActivities(intent, 0);
  56. }
  57. }

 

5.优化ListView

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

具体修改的代码如下

  1. @Override
  2. public View getView(int position, View convertView, ViewGroup parent) {
  3. ViewHolder holder = new ViewHolder();
  4. if(convertView==null){
  5. LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  6. convertView = layoutInflater.inflate(R.layout.item, null);
  7. holder.textView = (TextView) convertView.findViewById(R.id.item_text);
  8. holder.imageView = (ImageView) convertView.findViewById(R.id.image);
  9. convertView.setTag(holder);
  10. }else{
  11. holder = (ViewHolder)convertView.getTag();
  12. }
  13. holder.textView.setText(names.get(position).activityInfo.loadLabel(getPackageManager()));
  14. holder.imageView .setImageDrawable(names.get(position).activityInfo.loadIcon(getPackageManager()));
  15. return convertView;
  16. }
  17. public class ViewHolder{
  18. public TextView textView;
  19. public ImageView imageView;
  20. }

 

二: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一号

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/536689
推荐阅读
相关标签