热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现横向二级菜单

这篇文章主要为大家详细介绍了Android实现横向二级菜单的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android二级横向菜单的实现过程.效果如上图:

 

  这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算是项目需要,自己也就学了一下这个效果,首先说一下逻辑.实现的方式其实并不是很难..只不过逻辑上可能有点复杂.原理其实就是一个按钮.当触发按钮的时候弹出PopWindow.PopWindow由两个ListView构成..对两个ListView适当的适配.就可以实现这个效果了..

  实现这种效果可以有两种不同的方式..一种是直接在布局文件layout.xml中写..最上方的可以是一个按钮.也可以是多个按钮..多个按钮就可以使用RadioGroup去实现..下方则采用ScrollView去实现也是可以的..

  不过我还是说一下第二种方式..直接用Java去写这个布局..通过使用自定义控件的方式实现这个效果..既然是自定义,那么首先我们需要继承一个布局.布局可以使用LinearLayout或者RelativeLayout.

  setValue()方法..

  setValue()方法是自定义的方法..主要是用于加载布局.以及在布局当中添加相关的View.没有加载任何的xml文件..

  /**
   * @param textArray: ListView中item对应的text值的集合..
   * @param viewArray: 当前Layout中需要加入的View.. 
   * */
  @SuppressLint("ResourceAsColor") 
  public void setValue(ArrayList textArray, ArrayList viewArray) {
    if (mCOntext== null) {
      return;
    }
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mTextList = textArray;
    for (int i = 0; i 

  那么设置完了布局的样式后..只有一个ToggleButton按钮.点击后没有任何的效果.我们需要去定义一个新的View视图.用于点击按钮后需要显示的弹出窗.那么这个弹出窗也需要自定义..

 弹出窗则采用两个ListView的形式进行显示.在布局中将两个ListView进行添加.对每一个ListView设置相应的适配器.然后将这个View添加到上面的主View当中.就可以实现当button被点击后,弹出窗在下方进行显示的效果..

 ChildView() 弹出窗View的布局实现方式..

 这里定义了这个View,并完成相应的初始化操作.设置对应的适配器也就完成了..

package com.example.view;

import java.util.ArrayList;
import java.util.LinkedList;

import android.content.Context;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;

import com.example.adapter.TextAdapter;
import com.example.expandtabview.R;

public class ChildView extends LinearLayout {
  
  private ListView regionListView;  //主ListView
  private ListView plateListView;  //子ListView
  
  //主ListView每一个Item对应的text
  private String LeftFaString[] = new String[] { "美食", "快餐小吃", "火锅", "海鲜/烧烤",
      "特色菜", "香锅/烤鱼", "地方菜", "东南亚菜", "西餐", "日韩料理" };
  //子ListView每一个Item对应的text..采用了二维数组的实现方式..
  private String LeftCh1String[][] = new String[][] {
      { "全部" },
      { "全部", "中式简餐", "地方小吃", "盖浇饭", "米粉米线", "面馆", "麻辣烫", "黄焖鸡米饭",
          "鸭脖卤味", "饺子馄饨", "炸鸡炸串", "包子/粥", "零食", "生煎锅贴", "冒菜" },
      { "全部", "其他火锅" }, { "全部", "小龙虾" }, { "全部" }, { "全部", "香锅", "烤鱼" },
      { "全部", "鲁菜", "川菜", "其他" }, { "全部" },
      { "全部", "意面披萨", "西式快餐", "其他西餐" }, { "全部", "韩式简餐", "韩国料理" } };

  //添加主ListView中的数据信息
  private ArrayList groups = new ArrayList();
  
  //添加子ListView中的数据信息
  private LinkedList childrenItem = new LinkedList();
  
  //稀疏数组
  private SparseArray> children = new SparseArray>();
  //为ListView设置适配器
  private TextAdapter plateListViewAdapter;
  private TextAdapter earaListViewAdapter;
  //监听事件的设置
  private OnSelectListener mOnSelectListener;
  
  private int tEaraPosition = 0;   //用于保存当前主ListView被点击的Item对应的Position.
  private int tBlockPosition = 0;    //用于保存当前子ListView被点击的Item对应的Position.
  
  private String showString = "";

  public ChildView(Context context) {
    super(context);
    init(context);
  }

  public ChildView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }


  private void init(Context context) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    //加载布局,绑定ID.
    inflater.inflate(R.layout.view_region, this, true);
    regiOnListView= (ListView) findViewById(R.id.listView);
    plateListView = (ListView) findViewById(R.id.listView2);

    //初始化ListView中每一个item对应的text
    for(int i=0;i<10;i++){
      groups.add(LeftFaString[i]);
      LinkedList tItem = new LinkedList();
      for(int j=0;j

  那么最后就剩下适配器了..

  ArrayAdapter

  这里使用了ArrayAdapter适配器.继承与BaseAdapter.可以用于显示文本数据..我们也都知道,适配器必须要实现的方法就是getView()方法了..那么我们就简单的看一下这个方法..

  @SuppressLint("ResourceAsColor") @SuppressWarnings("deprecation")
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    TextView view;
    if (cOnvertView== null) {
      view = (TextView) LayoutInflater.from(mContext).inflate(R.layout.choose_item, parent, false);
    } else {
      view = (TextView) convertView;
    }
    view.setTag(position);
    String mString = "";
    if (mListData != null) {
      if (position 

  适配的工作还是非常的简单的.仅仅一个TextView就可以搞定了.当然我们也可以写一个比较复杂的样式.在一个Layout内部定义一些复杂的控件.就能够实现更好的效果.

  最后再MainActivity中的布局文件中加载这个控件,简单的做一些初始化操作就可以实现了..

package com.example.expandtabview;


import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.view.ExpandTabView;
import com.example.view.ChildView;

public class MainActivity extends Activity {

  private ExpandTabView expandTabView;
  private ArrayList mViewArray = new ArrayList();
  private ChildView viewLeft;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    initVaule();
    initListener();
    
  }

  private void initView() {
    
    //初始化控件
    expandTabView = (ExpandTabView) findViewById(R.id.expandtab_view);
    viewLeft = new ChildView(this);
    
  }

  private void initVaule() {
    
    mViewArray.add(viewLeft);
    
    //设置顶部数据信息
    ArrayList mTextArray = new ArrayList();
    mTextArray.add("全部");
    expandTabView.setValue(mTextArray, mViewArray);
    expandTabView.setTitle(viewLeft.getShowText(), 0);
    
  }

  private void initListener() {
    
    
    viewLeft.setOnSelectListener(new ChildView.OnSelectListener() {
      
      @Override
      public void getValue(String showText) {
        
        onRefresh(viewLeft,showText);
        
      }
    });
    
    
  }
  
  //视图被点击后刷新数据
  private void onRefresh(View view, String showText) {
    
    expandTabView.onPressBack();
    int position = getPositon(view);
    if (position >= 0 && !expandTabView.getTitle(position).equals(showText)) {
      expandTabView.setTitle(showText, position);
    }
    Toast.makeText(MainActivity.this, showText, Toast.LENGTH_SHORT).show();

  }
  
  //获取当前的view
  private int getPositon(View tView) {
    for (int i = 0; i 

 这里只是贴了一些核心代码.其他的涉及的一些不重要的代码就不在这里粘贴了..最后放一张图片流程.方便大家去理解.最后给出源代码.

 放一个源代码提供下载,方便去理解这个过程:Android实现横向二级菜单

以上就是本文的全部内容,希望对大家的学习有所帮助。


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
author-avatar
请叫我姚灬小贱_______
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有