今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式。

这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的。可能是因为平板屏幕比较大,而且也能展现更多的内容。

下面来看一下我的实现步骤。

首先自定义一个listview,代码如下:

[mw_shl_code=java,true]public class MyListView extends ListView implements Runnable {
        private float mLastDownY = 0f;
    private int mDistance = 0;
    private int mStep = 10;
    private boolean mPositive = false;

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

public MyListView (Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
    }

public MyListView (Context context) {
          super(context);
    }

@Override
    public boolean onTouchEvent(MotionEvent event) {
         switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN:
                   if (mLastDownY == 0f && mDistance == 0) {
                         mLastDownY = event.getY();
                   return true;
              }
              break;

case MotionEvent.ACTION_CANCEL:
           break;

case MotionEvent.ACTION_UP:
          if (mDistance != 0) {
           mStep = 1;
           mPositive = (mDistance >= 0);
           this.post(this);
           return true;
        }
        mLastDownY = 0f;
        mDistance = 0;
        break;

case MotionEvent.ACTION_MOVE:
        if (mLastDownY != 0f) {
              mDistance = (int) (mLastDownY - event.getY());
              if ((mDistance < 0 && getFirstVisiblePosition()
== 0 && getChildAt(0).getTop() == 0) || (mDistance > 0
&& getLastVisiblePosition() == getCount() - 1)) {
                   mDistance /= 2;
                   scrollTo(0, mDistance);
                   return true;
               }
        }
        mDistance = 0;
        break;
        }
        return super.onTouchEvent(event);
    }

public void run() {
          mDistance += mDistance > 0 ? -mStep : mStep;
          scrollTo(0, mDistance);
          if ((mPositive && mDistance <= 0) || (!mPositive && mDistance >= 0)) {
                scrollTo(0, 0);
                mDistance = 0;
                mLastDownY = 0f;
                return;
           }
          mStep += 1;
          this.postDelayed(this, 10);
     }
}
[/mw_shl_code]
然后看一下xml的布局:
[mw_shl_code=java,true]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<com.example.multilistview.MyListView
                        android:id="@+id/listView"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:choiceMode="singleChoice"
                        android:scrollbars="none"
                        android:divider="@drawable/listitem_divide"
                        android:listSelector="#00000000"
                        android:background="#e4e3de"
                        >
                    </com.example.multilistview.MyListView>
                           
                        <com.example.multilistview.MyListView
                           android:id="@+id/subListView"
                           android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:background="#e4e3de"
                         >
                               
                           </com.example.multilistview.MyListView>

</LinearLayout>
[/mw_shl_code]
两个自定义的listview  横向布局,然后是父listview的适配器
[mw_shl_code=java,true]public class MyAdapter extends BaseAdapter {

Context context;
        LayoutInflater inflater;
        String [] foods;
        int last_item;
        int [] images;
        private int selectedPosition = -1;     
        public MyAdapter(Context context,String [] foods,int[] images){
                this.context = context;
                this.foods = foods;
                this.images = images;
                inflater=LayoutInflater.from(context);
        }
       
        @Override
        public int getCount() {
                // TODO Auto-generated method stub
                return foods.length;
        }

@Override
        public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
        }

@Override
        public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
        }

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                ViewHolder  holder = null;
            if(convertView==null){
            convertView = inflater.inflate(R.layout.mylist_item, null);
            holder = new ViewHolder();
        holder.textView =(TextView)convertView.findViewById(R.id.textview);
        holder.imageView =(ImageView)convertView.findViewById(R.id.imageview);
        holder.layout=(LinearLayout)convertView.findViewById(R.id.colorlayout);
        convertView.setTag(holder);
            }
            else{
            holder=(ViewHolder)convertView.getTag();
            }
            // 设置选中效果   
             if(selectedPosition == position)   
            {   
                     holder.textView.setTextColor(Color.BLUE);

holder.layout.setBackgroundColor(Color.LTGRAY);   
           } else {   
                   holder.textView.setTextColor(Color.WHITE);   
            holder.layout.setBackgroundColor(Color.TRANSPARENT);   
             }

holder.textView.setText(foods[position]);
            holder.textView.setTextColor(Color.BLACK);
            holder.imageView.setBackgroundResource(images[position]);
            
                return convertView;
        }

public static class ViewHolder{
                public TextView textView;
                public ImageView  imageView;
                public LinearLayout layout;
        }

public void setSelectedPosition(int position) {   
           selectedPosition = position;   
        }

}
[/mw_shl_code]
对应的 item布局:
[mw_shl_code=java,true]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/colorlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<ImageView
    android:id="@+id/imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dip"
    android:layout_marginTop="5dip"
    />
    <TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="16dip"
    android:layout_marginTop="8dip"
    android:layout_marginLeft="8dip"
    android:layout_marginBottom="8dip"/>
   <!--  android:background="@drawable/selector"  自定义listview 样式-->
</LinearLayout>[/mw_shl_code]
然后是子适配器代码:
[mw_shl_code=java,true]public class SubAdapter extends BaseAdapter {
       
        Context context;
        LayoutInflater layoutInflater;
        String[][] cities;
        public int foodpoition;

public SubAdapter(Context context, String[][] cities,int position) {
                this.context = context;
                this.cities = cities;
                layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                this.foodpoition = position;
        }

@Override
        public int getCount() {
                // TODO Auto-generated method stub
                return cities.length;
        }

@Override
        public Object getItem(int position) {
                // TODO Auto-generated method stub
                return getItem(position);
        }

@Override
        public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
        }

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                ViewHolder viewHolder = null;
                final int location=position;
                if (convertView == null) {
                        convertView = layoutInflater.inflate(R.layout.sublist_item, null);
                        viewHolder = new ViewHolder();
                        viewHolder.textView = (TextView) convertView
                                        .findViewById(R.id.textview1);
                        convertView.setTag(viewHolder);
                } else {
                        viewHolder = (ViewHolder) convertView.getTag();
                }
                viewHolder.textView.setText(cities[foodpoition][position]);
                viewHolder.textView.setTextColor(Color.BLACK);
               
                return convertView;
        }

public static class ViewHolder {
                public TextView textView;
        }

}
[/mw_shl_code]
对应的xml布局:
[mw_shl_code=java,true]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
   
    >
     <TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="aaaaa"
    android:textSize="16dip"
    android:layout_marginTop="10dip"
    android:layout_marginLeft="8dip"
    android:layout_marginBottom="8dip"/>
</LinearLayout>[/mw_shl_code]
最后看下主activity的实现代码
[mw_shl_code=java,true]public class MainActivity extends Activity {
   
        private MyListView listView;
        private MyListView subListView;
        private MyAdapter myAdapter;
        private SubAdapter subAdapter;
       
        String cities[][] = new String[][] {
            new String[] {"全部美食", "本帮江浙菜", "川菜", "粤菜", "湘菜","东北菜","台湾菜","新疆/清真","素菜","火锅","自助餐","小吃快餐","日本","韩国料理",
            "东南亚菜","西餐","面包甜点","其他"},
            new String[] {"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                          "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部购物", "综合商场", "服饰鞋包", "运动户外","珠宝饰品","化妆品","数码家电","亲子购物","家居建材"
                          ,"书店","书店","眼镜店","特色集市","更多购物场所","食品茶酒","超市/便利店","药店"},
            new String[] {"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全","咖啡厅","酒吧","茶馆","KTV","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部","咖啡厅","酒吧","茶馆","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部休","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部休闲","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部休闲娱","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏"},
            new String[] {"全部休闲娱乐","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏","更多休闲娱乐"},
            new String[] {"全部休闲aaa","咖啡厅","酒吧","茶馆","KTV","电影院","游乐游艺","公园","景点/郊游","洗浴","足浴按摩","文化艺术",
                            "DIY手工坊","桌球馆","桌面游戏"},
            };
                String foods[] =new String []{"全部频道","美食","休闲娱乐","购物","酒店","丽人","运动健身","结婚","亲子","爱车","生活服务"};
                int images[] = new
int[]{R.drawable.ic_category_0,R.drawable.ic_category_10,R.drawable.ic_category_30,R.drawable.ic_category_20
                               
,R.drawable.ic_category_60,R.drawable.ic_category_50,R.drawable.ic_category_45,R.drawable.ic_category_50,R.drawable.ic_category_70,
                                R.drawable.ic_category_65,R.drawable.ic_category_80};
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        init();
        myAdapter=new MyAdapter(getApplicationContext(), foods, images);
        listView.setAdapter(myAdapter);
   
        selectDefult();
        
        listView.setOnItemClickListener(new OnItemClickListener() {

@Override
                        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                                        long arg3) {
                                // TODO Auto-generated method stub
                                final int location=position;
                                myAdapter.setSelectedPosition(position);
                                myAdapter.notifyDataSetInvalidated();
                                subAdapter=new SubAdapter(getApplicationContext(), cities, position);
                                subListView.setAdapter(subAdapter);
                                subListView.setOnItemClickListener(new OnItemClickListener() {

@Override
                                        public void onItemClick(AdapterView<?> arg0, View arg1,
                                                        int position, long arg3) {
                                                // TODO Auto-generated method stub
                                               
Toast.makeText(getApplicationContext(), cities[location][position],
Toast.LENGTH_SHORT).show();
                                        }
                                });
                        }
                });
        
    }
   private void init(){
           listView=(MyListView) findViewById(R.id.listView);
           subListView=(MyListView) findViewById(R.id.subListView);
   }
   
   private void selectDefult(){
           final int location=0;
                         myAdapter.setSelectedPosition(0);
                         myAdapter.notifyDataSetInvalidated();
                         subAdapter=new SubAdapter(getApplicationContext(), cities, 0);
                         subListView.setAdapter(subAdapter);
                         subListView.setOnItemClickListener(new OnItemClickListener() {

@Override
                                 public void onItemClick(AdapterView<?> arg0, View arg1,
                                                 int position, long arg3) {
                                         // TODO Auto-generated method stub
                                        
Toast.makeText(getApplicationContext(), cities[location][position],
Toast.LENGTH_SHORT).show();
                                 }
                         });
   }
  
}
[/mw_shl_code]
默认我选中了第0个,下面看一下运行效果:

android二级listview列表的更多相关文章

  1. 我的Android进阶之旅------>Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  2. Android一个ListView列表之中插入两种不同的数据

    http://www.cnblogs.com/roucheng/ Android一个ListView列表之中插入两种不同的数据 代码如下: public class ViewHolder{ Butto ...

  3. 【Android 界面效果33】二级listview列表

    今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式. 这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的.可能是因为平板屏 ...

  4. 解决Android中ListView列表只显示一项数据的问题

    思路:获取每项item的高度,并相加,再加上分割线的高度,作为整个ListView的高度,方法如下: public static void setListViewHeightBasedOnChildr ...

  5. Android UI组件----ListView列表控件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. Android 自学之列表视图ListView和ListActivity

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: 直接使用ListView创建. 让Activity继承ListActivity ...

  7. Android通过LIstView显示文件列表

    [绥江一百]http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...

  8. Android:控件ListView列表项与适配器结合使用

    Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...

  9. Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表

    前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...

随机推荐

  1. virtualBox虚拟机联网

    1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

  2. try except else

    try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后.这个子句将在try子句没有发生任何异常的时候执行.例如: for arg in sys. ...

  3. vs调试程序时发现变量、类等程序找不到混乱问题

    vs中不能同时打开两个解决方案名称相同的程序,否则会运行时出现混乱,比如变量监测不到,类的属性不全等问题

  4. mysql日志详解

    日志分类: 一.错误日志. 1.在配置文件中的配置是:log-error="DESKTOP-igoodful.err",查看参数的键值对:show variables like ' ...

  5. # 20155327 2016-2017-3 《Java程序设计》第5周学习总结

    20155327 2016-2017-3 <Java程序设计>第5周学习总结 教材学习内容总结 理解异常架构 粉红色的是受检查的异常(checked exceptions),其必须被 tr ...

  6. Assets.xcassets 应用

    1.应用 Assets.xcassets :用来存放图像资源文件 给项目添加 AppIcon 时图标要用 png 格式的,不要用其他格式.当是其它图片格式时 ,不要仅仅修改其后缀名,若仅仅修改后缀名, ...

  7. 隐马尔科夫模型(HMM)学习笔记二

    这里接着学习笔记一中的问题2,说实话问题2中的Baum-Welch算法编程时矩阵转换有点烧脑,开始编写一直不对(编程还不熟练hh),后面在纸上仔细推了一遍,由特例慢慢改写才运行成功,所以代码里面好多处 ...

  8. Linux基础命令---swapon

    swapon 在指定的设备上启用交换分区,使用的设备或文件由专用文件参数提供.它可以是”-L label”或”-U UUID”,以指示一个设备的标签或UUID.对swapon的调用通常发生在系统引导脚 ...

  9. web前端----jQuery基础语法

    一.jQuery基础1.为什么要用jquery? 写起来简单,省事,开发效率高,兼容性好2.什么是jQuery? jQuery是一个兼容多浏览器的JavaScript库(类似python里面的模块)3 ...

  10. 笔试题二(java面向对象、多线程、集合)

    1.final关键字的特点 final修饰变量时,在堆内存中的地址是不变的,但对象的内容是可变的.//思考,找例子 2.静态变量的特点 实例变量是用对象引用,要先实例化对象,而静态变量属于类,只要类加 ...