这个控件你必须会用!—ListView+GirdView合集

前言

Hello大家好,8点20分,我又双叒上线了!前面提到过的《亲,麻烦给个五星好评!—RatingBar(星级评分条)》中给大家提供了一个电商类App的思路,那么本节我们来继续学习没有讲完的UI控件部分, ListView+ GridView,这两个控件基本上是个软件都会使用,也是所有电商类App中必然会使用到的,由于手机屏幕空间有限,能够一次性在屏幕上显示的内容并不多,所以允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,当程序中有大量的数据需要展示的时候,就需要借助列表来实现。本文将介绍列表的一些常用属性、方法及事件,还会讲解在开发中常用的几种方式,以及使用通用的适配器Adapter定制个性的View视图用于 ListView的展示。

简介

ListView 列表视图,直接继承了 AbsListView,是一个以垂直方式在项目中显示 View视图的列表。ListView的数据项,来自一个继承了 ListAdapter接口的适配器。

GridView 在二维滚动网格中显示项目的视图,它的继承属性与 ListView相似,并且 GridView的用法很多,主要凸显的是网格式布局,既有横向也有纵向的数据显示。

继承关系:

   
  1. public class ListView(GridView) extends AbsListView


  2. java.lang.Object

  3. android.view.View

  4. android.view.ViewGroup

  5. android.widget.AdapterView<T extends android.widget.Adapter>

  6. android.widget.AbsListView

  7. android.widget.ListView(android.widget.GridView)

使用方式

ListView的使用

1.创建布局文件,首先新建一个 xml,命名为 activity_listview.xml ,代码如下:

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. xmlns:tools="http://schemas.android.com/tools"

  4. android:layout_width="match_parent"

  5. android:layout_height="match_parent"

  6. tools:context=".ListViewActivity">


  7. <ListView

  8. android:id="@+id/lv_commodity"

  9. android:layout_width="match_parent"

  10. android:layout_height="match_parent"

  11. android:cacheColorHint="#00000000"

  12. android:divider="@null"

  13. android:dividerHeight="0dp" />

  14. </LinearLayout>

xml属性介绍:

android:cacheColorHint="#00000000":去除listview的拖动背景色

android:divider:可在列表项之间绘制的可绘制或颜色。

android:dividerHeight:分隔器的高度。

android:entries:对将填充ListView的数组资源的引用。

android:footerDividersEnabled:当设置为false时, ListView不会在每个页脚视图之前绘制分隔符。

android:headerDividersEnabled:当设置为false时, ListView不会在每个标题视图之后绘制分隔符。

2.然后新建一个 xml,命名为 item_shoppingmall_commodity.xmlListView中每条信息的显示布局) ,代码如下:

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_width="match_parent"

  4. android:layout_height="wrap_content"

  5. android:gravity="center_horizontal"

  6. android:orientation="vertical">


  7. <ImageView

  8. android:layout_width="match_parent"

  9. android:layout_height="130dp"

  10. android:scaleType="centerCrop"

  11. android:src="@mipmap/ic_launcher" />


  12. <LinearLayout

  13. android:layout_width="match_parent"

  14. android:layout_height="wrap_content"

  15. android:padding="10dp">


  16. <TextView

  17. android:id="@+id/tv_shoppingmall_name"

  18. android:layout_width="0dp"

  19. android:layout_height="wrap_content"

  20. android:layout_weight="1"

  21. android:paddingRight="5dp"

  22. android:singleLine="true"

  23. android:text="haha"

  24. android:textColor="@color/black"

  25. android:textSize="16sp" />


  26. <TextView

  27. android:layout_width="wrap_content"

  28. android:layout_height="wrap_content"

  29. android:background="@color/colorAccent"

  30. android:text="爆款直降"

  31. android:textColor="@color/white"

  32. android:textSize="16sp" />

  33. </LinearLayout>


  34. <LinearLayout

  35. android:layout_width="match_parent"

  36. android:layout_height="wrap_content"

  37. android:paddingLeft="10dp"

  38. android:paddingBottom="10dp">


  39. <TextView

  40. android:layout_width="wrap_content"

  41. android:layout_height="wrap_content"

  42. android:text="1.4"

  43. android:textColor="@color/colorAccent"

  44. android:textSize="16sp" />


  45. <TextView

  46. android:layout_width="wrap_content"

  47. android:layout_height="wrap_content"

  48. android:paddingLeft="5dp"

  49. android:singleLine="true"

  50. android:text="折起"

  51. android:textColor="@color/black"

  52. android:textSize="16sp" />

  53. </LinearLayout>


  54. <TextView

  55. android:layout_width="wrap_content"

  56. android:layout_height="10dp"

  57. android:background="@color/clear" />

  58. </LinearLayout>

3.创建数据源,新建 ShoppingMallCommodityBean类,存放每个 Item的数据

   
  1. public class ShoppingMallCommodityBean {

  2. private String classifyName;


  3. public ShoppingMallCommodityBean(String classifyName) {

  4. this.classifyName = classifyName;

  5. }


  6. public String getClassifyName() {

  7. return classifyName;

  8. }


  9. public void setClassifyName(String classifyName) {

  10. this.classifyName = classifyName;

  11. }

  12. }

4.通过此 Bean类,我们就将要显示的数据与 ListView的布局内容一一对应了,每个 Bean对象对应 ListView的一条数据。这种方法在 ListView中使用的非常广泛。代码如下:

   
  1. public class ListViewActivity extends AppCompatActivity {

  2. @Override

  3. protected void onCreate(Bundle savedInstanceState) {

  4. super.onCreate(savedInstanceState);

  5. setContentView(R.layout.activity_listview);

  6. ListView lvCommodity = (ListView) findViewById(R.id.lv_commodity);

  7. ShoppingMallCommodityAdapter commodityAdapter = new ShoppingMallCommodityAdapter(this);

  8. // 设置ListView的数据适配器

  9. lvCommodity.setAdapter(commodityAdapter);

  10. //commodityList为数据列表,如果在真实项目里是通过访问接口从后台服务器获取数据,然后JSON解析显示的数据,我们后期会给大家讲Http通讯,这里我们先加载本地数据。

  11. List<ShoppingMallClassifyBean> commodityList = new ArrayList<ShoppingMallClassifyBean>();

  12. commodityList.add(new ShoppingMallClassifyBean("曼秀雷敦护肤专场"));

  13. commodityList.add(new ShoppingMallClassifyBean("欧莱雅Loreal彩妆专场"));

  14. commodityList.add(new ShoppingMallClassifyBean("爱美要护肤 freeplus护肤品质专场"));

  15. commodityList.add(new ShoppingMallClassifyBean("云南白药口腔护理专场"));

  16. commodityList.add(new ShoppingMallClassifyBean("贝览得彩妆工具专场"));

  17. commodityList.add(new ShoppingMallClassifyBean("小林制药护肤个护精选专场"));

  18. commodityList.add(new ShoppingMallClassifyBean("欧舒丹L'OCCITANE化妆品专场"));

  19. commodityList.add(new ShoppingMallClassifyBean("吕(RYO)奢宠护发专场"));

  20. commodityList.add(new ShoppingMallClassifyBean("Lancome护肤彩妆特卖专场"));

  21. commodityList.add(new ShoppingMallClassifyBean("完美日记PERFECT DIARY彩妆专场"));

  22. commodityList.add(new ShoppingMallClassifyBean("YSL圣罗兰星耀专场"));

  23. commodityList.add(new ShoppingMallClassifyBean("贝德玛洁颜护肤专场"));

  24. commodityList.add(new ShoppingMallClassifyBean("La Roche-Posay面部护理品质专场"));

  25. commodityList.add(new ShoppingMallClassifyBean("牙膏爱马仕Marvis口腔护理专场"));

  26. commodityAdapter.getShoppingMallData().addAll(commodityList);

  27. // 更新ListView的数据适配器数据

  28. commodityAdapter.notifyDataSetChanged();

  29. }

  30. }

5. Adapter适配器

就我自己来看,我觉得这是一个非常重要的知识点。下图展示了数据源、适配器、 ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而 ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与 ListView之间的适配关系,将数据源转换为 ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了 Android的适配器模式的使用。

这个控件你必须会用!—ListView+GirdView合集

对于 ListViewGridView等数据展示控件有多种数据适配器,这里就我们常用的几个进行讲解:

(1) ArrayAdapter<T> :用来绑定一个数组,支持泛型操作,最简单的一个 Adapter,只能展现一行文字。

(2) SimpleAdapter:用来绑定在 xml中定义的控件对应的数据,同样具有良好扩展性的一个 Adapter,可以自定义多种效果。

(3) SimpleCursorAdapter:用来绑定游标得到的数据

(4) BaseAdapter:通用的基础适配器,抽象类。实际开发中我们会继承这个类并且重写 BaseAdapter的四个方法,可以完成自己定义的 Adapter,可以将任何复杂组合的数据和资源,以任何你想要的显示效果展示给大家用得最多的一个 Adapter

本文讲解最通用的数据适配器—— BaseAdapter

设计自己的适配器,新建一个 adapter包,然后新建 ShoppingMallCommodityAdapter,代码如下:

   
  1. public class ShoppingMallCommodityAdapter extends BaseAdapter {

  2. private Context mContext;

  3. private List<ShoppingMallClassifyBean> mallBeanList = new ArrayList<ShoppingMallClassifyBean>();


  4. /**

  5. * 构造方法

  6. */

  7. public ShoppingMallCommodityAdapter(Context mContext) {

  8. this.mContext = mContext;

  9. }


  10. /**

  11. * 设置数据源与数据适配器进行关联

  12. */

  13. public List<ShoppingMallClassifyBean> getShoppingMallData() {

  14. return mallBeanList;

  15. }


  16. /**

  17. * 适配器中数据集中数据的个数

  18. */

  19. @Override

  20. public int getCount() {

  21. return mallBeanList.size();

  22. }


  23. /**

  24. * 指定索引对应的数据项

  25. */

  26. @Override

  27. public Object getItem(int position) {

  28. return null;

  29. }


  30. /**

  31. * 对应的索引项

  32. */

  33. @Override

  34. public long getItemId(int position) {

  35. return 0;

  36. }


  37. /**

  38. * 获取每一行Item的显示内容

  39. */

  40. @Override

  41. public View getView(int position, View convertView, ViewGroup parent) {

  42. ViewHolder holder = null;

  43. ////如果view未被实例化过,缓存池中没有对应的缓存

  44. if (convertView == null) {

  45. holder = new ViewHolder();

  46. // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null

  47. convertView = View.inflate(mContext, R.layout.item_shoppingmall_commodity, null);

  48. //对viewHolder的属性进行赋值

  49. holder.tvShoppingMallName = (TextView) convertView.findViewById(R.id.tv_shoppingmall_name);

  50. //通过setTag将convertView与viewHolder关联

  51. convertView.setTag(holder);

  52. } else {

  53. //如果缓存池中有对应的view缓存,则直接通过getTag取出viewHolder

  54. holder = (ViewHolder) convertView.getTag();

  55. }

  56. // 设置控件的数据

  57. ShoppingMallClassifyBean mallBean = mallBeanList.get(position);

  58. if ((mallBean != null)) {

  59. holder.tvShoppingMallName.setText(mallBean.getClassifyName());

  60. }

  61. return convertView;

  62. }


  63. /**

  64. * ViewHolder用于缓存控件,属性分别对应item布局文件的控件

  65. */

  66. class ViewHolder {

  67. TextView tvShoppingMallName;

  68. }

  69. }

此方式不仅利用了 ListView的缓存机制,而且使用 ViewHolder类来实现显示数据视图的缓存,避免多次调用 findViewById来寻找控件,以达到优化程序的目的。所以,大家在平时的开发中应当尽量使用这种方式进行 getView的实现。总结一下用创建内部类 ViewHolder优化 BaseAdapter的整体步骤:

创建Bean对象,用于封装数据

在构造方法中初始化用于映射的数据List

创建 ViewHolder类,创建布局映射关系

判断 convertView,为空则创建,并设置tag,否则通过tag来取出 ViewHolder

ViewHolder中的控件设置数据

最终效果如下:

这个控件你必须会用!—ListView+GirdView合集

Gridview的使用方法 ListView相似

1.这里新建一个 xml,命名为 activity_gridview.xml 中的代码,如下:

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. xmlns:tools="http://schemas.android.com/tools"

  4. android:layout_width="match_parent"

  5. android:layout_height="match_parent"

  6. tools:context=".GridViewActivity">


  7. <GridView

  8. android:id="@+id/gv_classify"

  9. android:layout_width="match_parent"

  10. android:layout_height="wrap_content"

  11. android:horizontalSpacing="5dp"

  12. android:listSelector="@null"

  13. android:numColumns="5"

  14. android:verticalSpacing="5dp" />

  15. </LinearLayout>

XML属性介绍:

android:columnWidth:指定每列的固定宽度。

android:gravity:指定每个单元内的重力。

android:horizontalSpacing:定义列之间的默认水平间距。

android:numColumns:定义要显示的列数。

android:stretchMode:定义列应如何拉伸以填充可用的空白空间(如果有)。

android:verticalSpacing:定义行之间的默认垂直间距。

android:scrollbars="none" :隐藏GridView的滚动条

注意:android:listSelector="#00000000"android:listSelector="@null"之区别 若设置成“ @null”时,点击该 gridview中的某个 item时,会显示橘黄色的显示背景(android系统默认设置颜色),若想设置点击时无色(透明色,不用系统背景色),并设置自己的点击效果,只需将上述设置成:android:listSelector="#00000000"

2.后面的步骤同 ListView的2、3、4、5即可。

点击运行项目你就能看到一个简单的 GridView,效果如下:

这个控件你必须会用!—ListView+GirdView合集

项目实操:

这里我们仿唯品会做一个简单的首页,这里用到的就是 ListView+ GridView,我们将界面上面的分类用 GridView来写,商品列表用 ListView来写。具体代码如下:

这里 ListViewGridViewitem要显示的字段比较多,考虑到显示问题,这里就要结合用到我们上一篇学到的 ScrollView来实现

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

  3. xmlns:tools="http://schemas.android.com/tools"

  4. android:layout_width="match_parent"

  5. android:layout_height="match_parent"

  6. android:background="@color/white"

  7. tools:context=".ShoppingMallActivity">


  8. <LinearLayout

  9. android:layout_width="match_parent"

  10. android:layout_height="wrap_content"

  11. android:orientation="vertical">


  12. <GridView

  13. android:id="@+id/gv_classify"

  14. android:layout_width="match_parent"

  15. android:layout_height="wrap_content"

  16. android:layout_marginTop="10dp"

  17. android:layout_marginBottom="20dp"

  18. android:horizontalSpacing="5dp"

  19. android:listSelector="@null"

  20. android:numColumns="5"

  21. android:verticalSpacing="5dp" />


  22. <ListView

  23. android:id="@+id/lv_commodity"

  24. android:layout_width="match_parent"

  25. android:layout_height="match_parent"

  26. android:cacheColorHint="#00000000"

  27. android:divider="@null"

  28. android:dividerHeight="0dp" />

  29. </LinearLayout>

  30. </ScrollView>

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_width="wrap_content"

  4. android:layout_height="wrap_content"

  5. android:gravity="center_horizontal"

  6. android:orientation="vertical">


  7. <ImageView

  8. android:layout_width="50dp"

  9. android:layout_height="50dp"

  10. android:src="@mipmap/icon_classify" />


  11. <TextView

  12. android:id="@+id/tv_shoppingmall_name"

  13. android:layout_width="wrap_content"

  14. android:layout_height="wrap_content"

  15. android:text="haha"

  16. android:textColor="@color/black"

  17. android:textSize="15sp"

  18. android:textStyle="bold" />

  19. </LinearLayout>

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_width="match_parent"

  4. android:layout_height="wrap_content"

  5. android:gravity="center_horizontal"

  6. android:orientation="vertical">


  7. <ImageView

  8. android:layout_width="match_parent"

  9. android:layout_height="130dp"

  10. android:scaleType="centerCrop"

  11. android:src="@mipmap/icon_commodity" />


  12. <LinearLayout

  13. android:layout_width="match_parent"

  14. android:layout_height="wrap_content"

  15. android:padding="10dp">


  16. <TextView

  17. android:id="@+id/tv_shoppingmall_name"

  18. android:layout_width="0dp"

  19. android:layout_height="wrap_content"

  20. android:layout_weight="1"

  21. android:paddingRight="5dp"

  22. android:singleLine="true"

  23. android:text="haha"

  24. android:textColor="@color/black"

  25. android:textSize="16sp" />


  26. <TextView

  27. android:layout_width="wrap_content"

  28. android:layout_height="wrap_content"

  29. android:background="@color/colorAccent"

  30. android:text="爆款直降"

  31. android:textColor="@color/white"

  32. android:textSize="16sp" />

  33. </LinearLayout>


  34. <LinearLayout

  35. android:layout_width="match_parent"

  36. android:layout_height="wrap_content"

  37. android:paddingLeft="10dp"

  38. android:paddingBottom="10dp">


  39. <TextView

  40. android:layout_width="wrap_content"

  41. android:layout_height="wrap_content"

  42. android:text="1.4"

  43. android:textColor="@color/colorAccent"

  44. android:textSize="16sp" />


  45. <TextView

  46. android:layout_width="wrap_content"

  47. android:layout_height="wrap_content"

  48. android:paddingLeft="5dp"

  49. android:singleLine="true"

  50. android:text="折起"

  51. android:textColor="@color/black"

  52. android:textSize="16sp" />

  53. </LinearLayout>

  54. </LinearLayout>

   
  1. public class ShoppingMallClassifyBean {

  2. private String classifyName;


  3. public ShoppingMallClassifyBean(String classifyName) {

  4. this.classifyName = classifyName;

  5. }


  6. public String getClassifyName() {

  7. return classifyName;

  8. }


  9. public void setClassifyName(String classifyName) {

  10. this.classifyName = classifyName;

  11. }

  12. }

   
  1. public class ShoppingMallCommodityBean {

  2. private String commodityName;


  3. public ShoppingMallCommodityBean(String commodityName) {

  4. this.commodityName = commodityName;

  5. }


  6. public String getCommodityName() {

  7. return commodityName;

  8. }


  9. public void setCommodityName(String commodityName) {

  10. this.commodityName = commodityName;

  11. }

  12. }

   
  1. public class ShoppingMallActivity extends AppCompatActivity {

  2. private GridView gvClassify;

  3. private ListView lvCommodity;

  4. private List<ShoppingMallClassifyBean> classifyList = new ArrayList<ShoppingMallClassifyBean>();

  5. private List<ShoppingMallCommodityBean> commodityList = new ArrayList<ShoppingMallCommodityBean>();

  6. private ShoppingMallClassifyAdapter classifyAdapter;

  7. private ShoppingMallCommodityAdapter commodityAdapter;


  8. @Override

  9. protected void onCreate(Bundle savedInstanceState) {

  10. super.onCreate(savedInstanceState);

  11. setContentView(R.layout.activity_shoppingmall);

  12. gvClassify = (GridView) findViewById(R.id.gv_classify);

  13. classifyAdapter = new ShoppingMallClassifyAdapter(this);

  14. gvClassify.setAdapter(classifyAdapter);

  15. setClassifyData();

  16. //给分类(GridView)设置item点击事件

  17. gvClassify.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  18. @Override

  19. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

  20. Toast.makeText(ShoppingMallActivity.this, "选中了分类:\n" + classifyList.get(position).getClassifyName(), Toast.LENGTH_SHORT).show();

  21. }

  22. });


  23. lvCommodity = (ListView) findViewById(R.id.lv_commodity);

  24. commodityAdapter = new ShoppingMallCommodityAdapter(this);

  25. lvCommodity.setAdapter(commodityAdapter);

  26. setCommodityData();

  27. //给商品列表(ListView)设置item点击事件

  28. lvCommodity.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  29. @Override

  30. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

  31. Toast.makeText(ShoppingMallActivity.this, "选中了商品:\n" + commodityList.get(position).getCommodityName(), Toast.LENGTH_SHORT).show();

  32. }

  33. });

  34. }


  35. /**

  36. * 设置分类数据(GridView)

  37. */

  38. private void setClassifyData() {

  39. classifyList.add(new ShoppingMallClassifyBean("女装"));

  40. classifyList.add(new ShoppingMallClassifyBean("男装"));

  41. classifyList.add(new ShoppingMallClassifyBean("鞋包"));

  42. classifyList.add(new ShoppingMallClassifyBean("手表配饰"));

  43. classifyList.add(new ShoppingMallClassifyBean("家居"));

  44. classifyList.add(new ShoppingMallClassifyBean("运动户外"));

  45. classifyList.add(new ShoppingMallClassifyBean("童装童鞋"));

  46. classifyList.add(new ShoppingMallClassifyBean("面部护肤"));

  47. classifyList.add(new ShoppingMallClassifyBean("国际品牌"));

  48. classifyList.add(new ShoppingMallClassifyBean("清仓"));

  49. classifyAdapter.getShoppingMallData().addAll(classifyList);

  50. classifyAdapter.notifyDataSetChanged();

  51. }


  52. /**

  53. * 设置商品列表数据(ListView)

  54. */

  55. private void setCommodityData() {

  56. commodityList.add(new ShoppingMallCommodityBean("曼秀雷敦护肤专场"));

  57. commodityList.add(new ShoppingMallCommodityBean("欧莱雅Loreal彩妆专场"));

  58. commodityList.add(new ShoppingMallCommodityBean("爱美要护肤 freeplus护肤品质专场"));

  59. commodityList.add(new ShoppingMallCommodityBean("云南白药口腔护理专场"));

  60. commodityList.add(new ShoppingMallCommodityBean("贝览得彩妆工具专场"));

  61. commodityList.add(new ShoppingMallCommodityBean("小林制药护肤个护精选专场"));

  62. commodityList.add(new ShoppingMallCommodityBean("欧舒丹L'OCCITANE化妆品专场"));

  63. commodityList.add(new ShoppingMallCommodityBean("吕(RYO)奢宠护发专场"));

  64. commodityList.add(new ShoppingMallCommodityBean("Lancome护肤彩妆特卖专场"));

  65. commodityList.add(new ShoppingMallCommodityBean("完美日记PERFECT DIARY彩妆专场"));

  66. commodityList.add(new ShoppingMallCommodityBean("YSL圣罗兰星耀专场"));

  67. commodityList.add(new ShoppingMallCommodityBean("贝德玛洁颜护肤专场"));

  68. commodityList.add(new ShoppingMallCommodityBean("La Roche-Posay面部护理品质专场"));

  69. commodityList.add(new ShoppingMallCommodityBean("牙膏爱马仕Marvis口腔护理专场"));

  70. commodityAdapter.getShoppingMallData().addAll(commodityList);

  71. commodityAdapter.notifyDataSetChanged();

  72. }

  73. }

   
  1. public class ShoppingMallClassifyAdapter extends BaseAdapter {

  2. private Context mContext;

  3. private List<ShoppingMallClassifyBean> mallBeanList = new ArrayList<ShoppingMallClassifyBean>();


  4. public ShoppingMallClassifyAdapter(Context mContext) {

  5. this.mContext = mContext;

  6. }


  7. public List<ShoppingMallClassifyBean> getShoppingMallData() {

  8. return mallBeanList;

  9. }


  10. @Override

  11. public int getCount() {

  12. return mallBeanList.size();

  13. }


  14. @Override

  15. public Object getItem(int position) {

  16. return null;

  17. }


  18. @Override

  19. public long getItemId(int position) {

  20. return 0;

  21. }


  22. @Override

  23. public View getView(int position, View convertView, ViewGroup parent) {

  24. ViewHolder holder = null;

  25. if (convertView == null) {

  26. holder = new ViewHolder();

  27. convertView = View.inflate(mContext, R.layout.item_shoppingmall_classify, null);

  28. holder.tvShoppingMallName = (TextView) convertView.findViewById(R.id.tv_shoppingmall_name);

  29. convertView.setTag(holder);

  30. } else {

  31. holder = (ViewHolder) convertView.getTag();

  32. }

  33. ShoppingMallClassifyBean mallBean = mallBeanList.get(position);

  34. if ((mallBean != null)) {

  35. holder.tvShoppingMallName.setText(mallBean.getClassifyName());

  36. }

  37. return convertView;

  38. }


  39. class ViewHolder {

  40. TextView tvShoppingMallName;

  41. TextView item_mRankNameTxtl;

  42. TextView item_mTotalScoreTxt;

  43. TextView item_mTotalScoreUnit;

  44. }

  45. }

   
  1. public class ShoppingMallCommodityAdapter extends BaseAdapter {

  2. private Context mContext;

  3. private List<ShoppingMallCommodityBean> mallBeanList = new ArrayList<ShoppingMallCommodityBean>();


  4. public ShoppingMallCommodityAdapter(Context mContext) {

  5. this.mContext = mContext;

  6. }


  7. public List<ShoppingMallCommodityBean> getShoppingMallData() {

  8. return mallBeanList;

  9. }


  10. @Override

  11. public int getCount() {

  12. return mallBeanList.size();

  13. }


  14. @Override

  15. public Object getItem(int position) {

  16. return null;

  17. }


  18. @Override

  19. public long getItemId(int position) {

  20. return 0;

  21. }


  22. @Override

  23. public View getView(int position, View convertView, ViewGroup parent) {

  24. ViewHolder holder = null;

  25. if (convertView == null) {

  26. holder = new ViewHolder();

  27. convertView = View.inflate(mContext, R.layout.item_shoppingmall_commodity, null);

  28. holder.tvShoppingMallName = (TextView) convertView.findViewById(R.id.tv_shoppingmall_name);

  29. convertView.setTag(holder);

  30. } else {

  31. holder = (ViewHolder) convertView.getTag();

  32. }

  33. ShoppingMallCommodityBean mallBean = mallBeanList.get(position);

  34. if ((mallBean != null)) {

  35. holder.tvShoppingMallName.setText(mallBean.getCommodityName());

  36. }

  37. return convertView;

  38. }


  39. class ViewHolder {

  40. TextView tvShoppingMallName;

  41. TextView item_mRankNameTxt;

  42. TextView item_mTotalScoreTxt;

  43. TextView item_mTotalScoreUnit;

  44. }

  45. }

效果:

这个控件你必须会用!—ListView+GirdView合集

OMG!这是什么神仙操作这个控件你必须会用!—ListView+GirdView合集

嘿嘿,这里就有个问题当 ScrollView嵌套 GridViewListView一起用的时候会冲突,你会发现 ListView始终显示的是第一个 Item而其他的 item不见了,其实不是其他的 item不见了,而是其他的item被第一个 item遮挡了,其实是你的 ScrollView的滑动时间和 Listview的滑动事件起冲突了,这里我们就要重写 ListViewGridView

1.这里新建一个自定义 GridView,命名为 ScrollGridView ,如下:

   
  1. public class ScrollGridView extends GridView {

  2. public ScrollGridView(Context context, AttributeSet attrs) {

  3. super(context, attrs);

  4. }


  5. public ScrollGridView(Context context) {

  6. super(context);

  7. }


  8. public ScrollGridView(Context context, AttributeSet attrs, int defStyle) {

  9. super(context, attrs, defStyle);

  10. }


  11. @Override

  12. public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

  13. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);

  14. super.onMeasure(widthMeasureSpec, expandSpec);

  15. }

  16. }

2.然后再新建一个自定义 ListView,命名为 ScrollListView ,如下:

   
  1. public class ScrollListView extends ListView {


  2. public ScrollListView(Context context) {

  3. super(context);

  4. }


  5. public ScrollListView(Context context, AttributeSet attrs) {

  6. super(context, attrs);

  7. }


  8. public ScrollListView(Context context, AttributeSet attrs, int defStyle) {

  9. super(context, attrs, defStyle);

  10. }


  11. @Override

  12. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

  13. //加上下面的话即可实现listview在scrollview中滑动

  14. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);

  15. super.onMeasure(widthMeasureSpec, expandSpec);

  16. }

  17. }

最后我们将 activity_shoppingmall.xml改一下

   
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

  3. xmlns:tools="http://schemas.android.com/tools"

  4. android:layout_width="match_parent"

  5. android:layout_height="match_parent"

  6. android:background="@color/white"

  7. tools:context=".ShoppingMallActivity">


  8. <LinearLayout

  9. android:layout_width="match_parent"

  10. android:layout_height="wrap_content"

  11. android:orientation="vertical">


  12. <com.xmkh.test.widget.ScrollGridView

  13. android:id="@+id/gv_classify"

  14. android:layout_width="match_parent"

  15. android:layout_height="wrap_content"

  16. android:layout_marginTop="10dp"

  17. android:layout_marginBottom="20dp"

  18. android:horizontalSpacing="5dp"

  19. android:listSelector="@null"

  20. android:numColumns="5"

  21. android:verticalSpacing="5dp" />


  22. <com.xmkh.test.widget.ScrollListView

  23. android:id="@+id/lv_commodity"

  24. android:layout_width="match_parent"

  25. android:layout_height="match_parent"

  26. android:cacheColorHint="#00000000"

  27. android:divider="@null"

  28. android:dividerHeight="0dp" />

  29. </LinearLayout>

  30. </ScrollView>

最终效果如下:

这个控件你必须会用!—ListView+GirdView合集

结语

相信小伙伴们一定已经会用列表控件了,demo中还增加了列表的单击事件,更多方法你自己试试就知道了,因为纸上得来终觉浅嘛。还想看更多实用的控件用法,记得点赞留言告诉我,贴心小花花时刻在线等着你!欢迎各位小伙伴加入我们的微信技术交流群,在公众号中回复微信群,就可以加入其中,也可以在公众号中回复视频,里面有一些初学者视频哦~

PS:如果还有未看懂的小伙伴,欢迎加入我们的QQ技术交流群:892271582,里面有各种大神回答小伙伴们遇到的问题。


简介:主人有点忙,还没来得及写简介~

声明:本文来自“下码看花”,本文链接:https://www.zyxiao.com/p/8436

发表评论

登录后才能评论
网站客服
网站客服
内容投稿 侵权处理
分享本页
返回顶部