效果图

实现思维

  1. 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们。
  2. 创建一个主activity的布局,里面需要一个ListView控件。
  3. 创建一个class继承GirdView,并且重写它。我们需要取消GirdView布局的滚动,让它显示全部内容
  4. 创建一个GirdView的布局,里面导入我们重写好GirdView控件。
  5. 创建GirdView布局里面小图标的布局。
  6. 创建一个class继承GirdView的适配器,我们需要重写GirdView适配器class
  7. 创建ListView适配器使用的数据集合的单例class。
  8. 创建一个class继承ListView的适配器,我们需要重写ListView适配器class
  9. 在主activity里实例ListView,处理数据,数据导入适配器,ListView设置适配器

代码部分

1.首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们。

这里涉及隐私我只贴出部分代码做参考

package com.example.lenovo.mydemoapp.myMoreOptions;

import com.example.lenovo.mydemoapp.R;

/**
* Created by lenovo on 2018/5/22.
*/ /*
更多选项列表的数据存放class
*/
public class MoreOptionsData {
//沟通组
private static final String mPhoneTitlem_Title_Text = "沟通";
private static final String [] mPhoneTitlem_Content_Text = {"电话","群聊","私聊","倾听","录音","拍照"};
//得到沟通组数据
public static int[] getmPhoneTitlemContent_Image() {
return mPhoneTitlem_Content_Image;
} public static String[] getmPhoneTitlemContent_Text() {
return mPhoneTitlem_Content_Text;
} public static String getmPhoneTitlem_Title_Text() {
return mPhoneTitlem_Title_Text;
} //得到运动组数据
public static int[] getmMovementTitlemContent_Image() {
return mMovementTitlem_Content_Image;
} public static String[] getmMovementTitlemContent_Text() {
return mMovementTitlem_Content_Text;
} public static String getmMovementTitlem_Title_Text() {
return mMovementTitlem_Title_Text;
} //得到设置组数据
public static int[] getmSettingsTitlemContent_Image() {
return mSettingsTitlem_Content_Image;
} public static String[] getmSettingsTitlemContent_Text() {
return mSettingsTitlem_Content_Text;
} public static String getmSettingsTitlem_Title_Text() {
return mSettingsTitlem_Title_Text;
} //得到其他组数据
public static int[] getmOtherTitlemContent_Image() {
return mOtherTitlem_Content_Image;
} public static String[] getmOtherTitlemContent_Text() {
return mOtherTitlem_Content_Text;
} public static String getmOtherTitlem_Title_Text() {
return mOtherTitlem_Title_Text;
}
//得到四组数据的数组
public static String[] getTitle_Text_Attrs(){
return new String[] {mPhoneTitlem_Title_Text,mMovementTitlem_Title_Text,mSettingsTitlem_Title_Text,mOtherTitlem_Title_Text};
}
public static String[][] getContent_Text_Attrs(){
return new String[][] {mPhoneTitlem_Content_Text,mMovementTitlem_Content_Text,mSettingsTitlem_Content_Text,mOtherTitlem_Content_Text};
}
public static int[][] getContent_Image_Attrs(){
return new int[][] {mPhoneTitlem_Content_Image,mMovementTitlem_Content_Image,mSettingsTitlem_Content_Image,mOtherTitlem_Content_Image};
}
}

2.创建一个主activity的布局,里面需要一个ListView控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
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="com.example.lenovo.mydemoapp.MoreOptions"
>
<com.example.lenovo.mydemoapp.myLayout.TitleLayout
app:titleNameText="显示标题"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.lenovo.mydemoapp.myLayout.TitleLayout>
<ListView
android:id="@+id/MoreOptions_ListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:dividerHeight="20dp"
android:divider="@color/colorWhite">
</ListView> </LinearLayout>

3.创建一个class继承GirdView,并且重写它。我们需要取消GirdView布局的滚动,让它显示全部内容

package com.example.lenovo.mydemoapp.myMoreOptions;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView; /**
* Created by lenovo on 2018/5/23.
*/ public class NoScrollGridView extends GridView {
public NoScrollGridView(Context context, AttributeSet attrs) {
super(context, attrs);
} public NoScrollGridView(Context context) {
super(context);
} public NoScrollGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//核心在此
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 3,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

4.创建一个GirdView的布局,里面导入我们重写好GirdView控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/input_box_background">
<TextView
android:id="@+id/MoreOptions_GridView_TitleName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题名称"
android:textSize="@dimen/BigTextSize"
android:textColor="@color/colorBlue"/>
<com.example.lenovo.mydemoapp.myMoreOptions.NoScrollGridView
android:id="@+id/MoreOptions_GridView"
android:numColumns="3"
android:stretchMode="columnWidth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:horizontalSpacing="20dp"
android:verticalSpacing="20dp"
android:layout_marginTop="20dp">
</com.example.lenovo.mydemoapp.myMoreOptions.NoScrollGridView> </LinearLayout>

5.创建GirdView布局里面小图标的布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<ImageView
android:id="@+id/more_options_grid_view_subclass_ImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_funciton_shutdown"/>
<TextView
android:id="@+id/more_options_grid_view_subclass_TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="图标名称"
android:textColor="@color/colorBlue"
android:textSize="@dimen/BigTextSize"
android:layout_marginTop="15dp"/> </LinearLayout>

6.创建一个class继承GirdView的适配器,我们需要重写GirdView适配器class

package com.example.lenovo.mydemoapp.myMoreOptions;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import com.example.lenovo.mydemoapp.R;
import com.example.lenovo.mydemoapp.myDeviceList.DeivceListAdapter; import java.util.ArrayList;
import java.util.List; /**
* Created by lenovo on 2018/5/22.
*/
/*
GridView的适配器class
*/
public class MoreOptionsGridViewAdapter extends BaseAdapter {
//创建一个数据集合,将传入的数组转化成List集合
private List<DataList> mdataLists = new ArrayList<DataList>();
//将传入的Context设置为全局变量
private Context mContext;
public MoreOptionsGridViewAdapter(Context context){
super();
this.mContext = context;
}
@Override
public int getCount() {
return mdataLists.size();
} @Override
public Object getItem(int position) {
return mdataLists.get(position);
} @Override
public long getItemId(int position) {
return position;
}
/*
自写一个数据导入的方法,在方法将在ListView的适配器class里调用,
因为我们将GridView适配器数据导入放到了ListView适配器class中
*/
public void setmList(String[] name,int[] image){
for (int i=0;i<name.length;i++){
//实例化一个单例内部class导入数据
DataList dataList = new DataList(name[i],image[i]);
//添加到集合中
mdataLists.add(dataList);
}
} /*
重写getView方法,获得控件单例,添加单例数据,缓存单例
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//用于缓存的控件的class,目的是不让一个控件的获取需要反复使用findViewById,可以优化滚动布局速度
MoreOptionsViewHolder moreOptionsViewHolder;
//如果当前的一个的View是空的,那就重新findViewById获取它。
if (convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.more_options_grid_view_subclass,null);
moreOptionsViewHolder = new MoreOptionsViewHolder();
moreOptionsViewHolder.name = (TextView)convertView.findViewById(R.id.more_options_grid_view_subclass_TextView);
moreOptionsViewHolder.image = (ImageView)convertView.findViewById(R.id.more_options_grid_view_subclass_ImageView);
convertView.setTag(moreOptionsViewHolder);
}else { //如果有这个View,那就继续使用已经找到的子类控件实例
moreOptionsViewHolder = (MoreOptionsViewHolder)convertView.getTag();
}
//根据当前位置获取List数据集合中的单例
DataList dataList = mdataLists.get(position);
//配置控件单例对应的List单例数据
moreOptionsViewHolder.image.setImageResource(dataList.getImage());
moreOptionsViewHolder.name.setText(dataList.getName());
return convertView;
}
/*
写一个数据存放的单例内部class
*/
class DataList{
private String name;
private int image;
public DataList(String name,int image){
this.name = name;
this.image = image;
}
public int getImage() {
return image;
} public String getName() {
return name;
}
}
/*
控件缓存
*/
class MoreOptionsViewHolder {
public TextView name;
public ImageView image;
}
}

7.创建ListView适配器使用的数据集合的单例class。

package com.example.lenovo.mydemoapp.myMoreOptions;

import android.widget.GridView;

/**
* Created by lenovo on 2018/5/23.
*/ public class MoreOptionsDataLineViewData {
private GridView gridView;
private String TitleName ;
public MoreOptionsDataLineViewData(String titleName,GridView gridView){
this.TitleName = titleName;
this.gridView = gridView;
}
public String getTitleName() {
return TitleName;
} public GridView getGridView() {
return gridView;
}
}

8.创建一个class继承ListView的适配器,我们需要重写ListView适配器class

package com.example.lenovo.mydemoapp.myMoreOptions;

import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView; import com.example.lenovo.mydemoapp.R; import java.util.ArrayList;
import java.util.List; /**
* Created by lenovo on 2018/5/23.
*/
/*
ListView的适配器类
*/
public class MoreOptionsListViewAdapter extends ArrayAdapter<MoreOptionsDataLineViewData>{
List<MoreOptionsDataLineViewData> mlineViewDatas;
//布局ID
int resourceId;
public MoreOptionsListViewAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<MoreOptionsDataLineViewData> objects) {
super(context, resource, objects);
resourceId = resource;
} @NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
MoreOptionsDataLineViewData moreOptionsDataLineViewData = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
TextView textView = (TextView)view.findViewById(R.id.MoreOptions_GridView_TitleName);
GridView gridView = (GridView)view.findViewById(R.id.MoreOptions_GridView);
//导入标题栏数据
textView.setText(moreOptionsDataLineViewData.getTitleName());
//实例化一个GridView的适配器class
MoreOptionsGridViewAdapter moreOptionsGridViewAdapter = new MoreOptionsGridViewAdapter(view.getContext());
//添加适配器的数据
moreOptionsGridViewAdapter.setmList(new MoreOptionsData().getContent_Text_Attrs()[position]
,new MoreOptionsData().getContent_Image_Attrs()[position]);
//将gridView设置适配器
gridView.setAdapter(moreOptionsGridViewAdapter);
return view;
}
}

9.在主activity里实例ListView,处理数据,数据导入适配器,ListView设置适配器

package com.example.lenovo.mydemoapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.GridView;
import android.widget.ListView; import com.example.lenovo.mydemoapp.myMoreOptions.MoreOptionsData;
import com.example.lenovo.mydemoapp.myMoreOptions.MoreOptionsDataLineViewData;
import com.example.lenovo.mydemoapp.myMoreOptions.MoreOptionsGridViewAdapter;
import com.example.lenovo.mydemoapp.myMoreOptions.MoreOptionsListViewAdapter; import java.util.ArrayList;
import java.util.List; public class MoreOptions extends AppCompatActivity {
//实例数据class
private MoreOptionsData mMoreOptionsData = new MoreOptionsData();
//创建listView使用的数据集合
private List<MoreOptionsDataLineViewData> lineViewDatas = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more_options);
ListView listView = (ListView)findViewById(R.id.MoreOptions_ListView);
//根据标题名称数组长度创建GridView的数量
for (int i=0;i<mMoreOptionsData.getTitle_Text_Attrs().length;i++){
//创建GridView的实例,注意这里的GridView我们并没有设置适配器,而是直接添加到List数据集合中,一起传入ListView的适配器Class里面。
//我们将在ListView的适配器class里面,在给GridView的单例设置GridView的适配器class
GridView gridView = (GridView)findViewById(R.id.MoreOptions_GridView);
//给集合的单例添加数据: 数据为一个标题名称,一个GridView实例
MoreOptionsDataLineViewData lineViewData = new MoreOptionsDataLineViewData(mMoreOptionsData.getTitle_Text_Attrs()[i],gridView);
///将单例数据导入listView使用的数据集合中
lineViewDatas.add(lineViewData);
}
//给ListView的适配器导入数据
MoreOptionsListViewAdapter moreOptionsListViewAdapter = new MoreOptionsListViewAdapter(MoreOptions.this,R.layout.more_options_grid_view,lineViewDatas);
//给ListView设置适配器
listView.setAdapter(moreOptionsListViewAdapter);
}
}
 

android 开发 实现一个ListView套嵌GirdView的滚动布局的更多相关文章

  1. Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...

  2. android 开发 实现一个带图片Image的ListView

    注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...

  3. 2016 校招, Android 开发,一个本科应届的坎坷求职之路(转)

    转载出处:http://www.nowcoder.com/discuss/3244?type=2&order=0&pos=1&page=1 和大多数的面经不同,我不是大牛,手头 ...

  4. Android开发系列之ListView

    上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如 ...

  5. android 开发 实现一个app的引导查看页面(使用ViewPager组件)

    我们安装完app后第一次打开app,通常都会有一个翻页图片形式的app引导简介说明.下面我们来实现这个功能.ViewPager这个组件与ListView和RecyclerView在使用上有很高的相似处 ...

  6. android 开发 实现一个app的引导页面,使用ViewPager组件(此引导的最后一页的Button会直接写在最后一页布局里,跟随布局滑进滑出)

    基本ViewPager组件使用方式与我之前写的https://blog.csdn.net/qq_37217804/article/details/80332634 这篇博客一致. 下面我们将重点详细解 ...

  7. 【Android开发日记】妙用 RelativeLayout 实现3 段布局

    在设计过程中,我们经常会遇到这样的需求: 把一条线3控制,左对齐左控制,右侧控制右对齐,中间控制,以填补剩余空间. 或者一列内放3个控件,上面的与顶部对齐,以下的沉在最底部,中间控件是弹性的.充满剩余 ...

  8. Android开发笔记(一百三十四)协调布局CoordinatorLayout

    协调布局CoordinatorLayout Android自5.0之后对UI做了较大的提升.一个重大的改进是推出了MaterialDesign库,而该库的基础即为协调布局CoordinatorLayo ...

  9. Android开发实战之拥有Material Design风格的侧滑布局

    在实现开发要求中,有需要会使用抽屉式布局,类似于QQ5.0的侧滑菜单,实现的方式有很多种,可以自定义控件,也可以使用第三方开源库. 同样的谷歌也推出了自己的侧滑组件——DrawLayout,使用方式也 ...

随机推荐

  1. centos 6,7 上cgroup资源限制使用举例

    在Centos6,7使用cgroup做内存限制,使用的配置包是libcgroup,具体方案和操作步骤如下. 步骤1:安装配置管理包 Centos 6: # yum install libcgroup ...

  2. pyhanlp 文本聚类详细介绍

    文本聚类 文本聚类简单点的来说就是将文本视作一个样本,在其上面进行聚类操作.但是与我们机器学习中常用的聚类操作不同之处在于. 我们的聚类对象不是直接的文本本身,而是文本提取出来的特征.因此如何提取特征 ...

  3. spring boot 整合dubbo

    dubbo与springboot的集成和使用dubbo-spring-boot-starter SpringBoot整合Dubbo2.5.10(官方的spring-boot-starter0.1.0) ...

  4. 安装centos7启动项配置

    安装centos7启动项配置 1.将 setparams 'Install CentOS Linux 7' linuxefi/images/pxeboot/vmlinuz inst.stage2=hd ...

  5. 页面框架加载完自动执行函数$(function(){});

    页面中有一些大的资源文件,如图片,声音等,如果一个事件绑定写在这些加载资源代码的下方,那么要等资源加载完才会绑定,这样体验不够好. 于是想不等资源加载完,只要框架加载完成就绑定事件,就可以把代码放在以 ...

  6. centos 磁盘清理 /dev/vda1系统盘满了

    df   -h   检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr   当然这里不一定是/usr目录,最好是cd到 根目录再执行下一步 2.du -sh * 看哪 ...

  7. Windows下利用TortoiseSVN搭建本地SVN服务器

    写在前面: 安装TortoiseSVN时,图中这步要选择,才能同时安装后面需要的svnserve.exe 环境说明: Win 7 TortoiseSVN 1.7 搭建步骤: 0. 新建一个目录,做&q ...

  8. 《Java并发编程实战》笔记-Happens-Before规则

    Happens-Before规则 程序顺序规则.如果程序中操作A在操作B之前,那么在线程中A操作将在B操作之前执行. 监视器锁规则.在监视器锁上的解锁操作必须在同一个监视器锁上的加锁操作之前执行. v ...

  9. 信息安全-加密:RSA 算法

    ylbtech-信息安全-加密:RSA 算法 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 1.返 ...

  10. 构建Redis主从镜像

    构建Redis的基础镜像,然后基于这个基础镜像构建主Redis镜像和从Redis镜像. 1.构建Redis基础镜像 创建redis基础镜像目录 [root@localhost mnt]# mkdir ...