`
ansonlh
  • 浏览: 37190 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类

Android开发,用ExpandableListView+Dialog 仿Spinner

阅读更多
讨论学习,共同进步。
纯粹闲了没事,学习了1个月的Android开发,所以稚嫩之处敬请谅解。
用ExpandableListView+Dialog 仿Spinner,还有待完善。

在iteye上下了很多资料,今天第一帖回报这个论坛。



主要功能:
1. 异步填充list数据,TitleBar显示正在运行的进度条(犹豫数据少,很难发现运行)
2. 类似Spinner控件的弹出式ExpandableListView选择窗口,实现记忆选择项
   注意点是弹出窗要常驻内存,再次绑定数据后要重新定位上次选择项
    
未解决问题:
1. 由于EL Adapter的特性,当点击Group项后,上次选择的Child项无法去除背景,会和新选择的项同事存在,再次点击Group后才能去除;

Android开发,用ExpandableListView+Dialog <wbr>仿Spinner


主类



package com.Anson.ExpandableListViewDialogDemo;

import com.Anson.ExpandableListViewDialogDemo.R;

import android.app.Activity;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;

import android.app.Dialog;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;

public class ExpandableListViewDialog extends Activity {
  
    private Button btnShowDialog;
    private EditText editText1;
  
    private ExpandableListView elvForDialog;    //Layout expandablelist.xml 中的控件
    private Dialog dialogMarketList;            //弹出类似Spinner选择项的窗口
    private View viewList;                      //设给弹出窗口的view
    private View viewListLastSelected;          //上次选中项的缓存view
  
    List<String> listGroup = new ArrayList<String>();
    List<List<String>> listChild = new ArrayList<List<String>>();
          
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        //先给Activity注册界面进度条功能
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
      
        setContentView(R.layout.main);
      
        try{
            editText1 = (EditText) findViewById(R.id.editText1);
          
            btnShowDialog = (Button) findViewById(R.id.btnShowDialog);
            btnShowDialog.setOnClickListener(new OnClickListener(){
                    @Override
                    public void onClick(View view)
                    {              
                        dialogMarketList.show();      
                    }
                    });
          
            createExpandableListViewDialog();
                      
            //Load data in different thread from the main UI
            new Thread(){    
                @Override
                public void run(){
                    //显示TitleBar的进度条
                    setProgressBarIndeterminateVisibility(true);
                  
                    //Methods need time to calculate              
                    for (int i = 0; i < 3; i++) {                  
                        listGroup.add("Group " + i);
                        //Log.v("LH", "Group: " + i);
                      
                        List<String> children = new ArrayList<String>();
                        for (int j = 0; j < 2; j++) {
                            children.add("Group: " + i + "  |  Child: " + j);
                            //Log.v("LH", "Group: " + i + "  |  Child: " + j);
                        }
                        listChild.add(children);
                    }
                    //Send message to handler
                    handler.sendEmptyMessage(0);
                }}.start();
        }
        catch(Exception e)
        {
            showToastMessage(e.toString());          
            Log.v("LH", "ERROR@onCreate: " + e.toString());
        }
    }
          
    private void createExpandableListViewDialog()
    {      
        viewList = ExpandableListViewDialog.this.getLayoutInflater().inflate(R.layout.expandablelist, null);
        dialogMarketList = new Dialog(ExpandableListViewDialog.this);
        dialogMarketList.setContentView(viewList);
      
        dialogMarketList.setTitle("Dialog Demo");
        elvForDialog = (ExpandableListView) viewList.findViewById(R.id.elvForDialog); //Here should use the Dialog view
      
        //绑定ExpandableListView的数据
        MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(ExpandableListViewDialog.this, listGroup, listChild);              
        elvForDialog.setAdapter(mAdapter);
      
      
        elvForDialog.setOnGroupClickListener(new OnGroupClickListener(){
            @Override
            public boolean onGroupClick(ExpandableListView arg0, View arg1,
                    int arg2, long arg3) throws RuntimeException {              
                try{
                    //将上一个选中项的背景清空
                    //viewListLastSelected.setBackgroundDrawable(null);  
                    Log.v("LH", "@setOnGroupClickListener");
                    Log.v("LH", "" + viewListLastSelected.toString());
                    Log.v("LH", "" + ((TextView)viewListLastSelected).getText());
                    //viewListLastSelected.setBackgroundResource(R.drawable.bg_toolbar);
                    //((TextView)viewListLastSelected).setTextColor(Color.BLUE);
                    //Generic.selectedTextViewID = ((TextView)viewListLastSelected).getId();
                  
                }
                catch(Exception e){    Log.v("LH", "ERROR@onCreate: " + e.toString());    }
                return false;
            }                  
        });
      
      
        elvForDialog.setOnChildClickListener(new OnChildClickListener(){
            @Override
            public boolean onChildClick(ExpandableListView arg0, View arg1,
                    int arg2, int arg3, long arg4) throws RuntimeException
            {  
                //Generic.setGroupPosition(arg2);
                //Generic.setChildPosition(arg3);
              
                showToastMessage("[Child Click]:" + arg2 + "|" + arg3 + " -- " + listChild.get(arg2).get(arg3).toString());
              
                //elvForDialog.clearChoices();
                elvForDialog.clearChildFocus(viewListLastSelected);
              
                try{
                    //将上一个选中项的背景清空
                    Log.v("LH", "@setOnChildClickListener");
                    viewListLastSelected.setBackgroundDrawable(null);
                    ((TextView)viewListLastSelected).setTextColor(Color.BLACK);
                    //elvForDialog.getSelectedView().setBackgroundDrawable(null);                  
                }
                catch(Exception e){}
              
                //设置在当前选中项的背景
                arg1.setBackgroundResource(R.drawable.bg_toolbar);
                ((TextView)arg1).setTextColor(Color.WHITE);
              
                //缓存当前选中项至上一个选中项
                viewListLastSelected = arg1;
              
                //Put value to main UI's control
                editText1.setText(listChild.get(arg2).get(arg3).toString());
              
                //Close the dialog
                dialogMarketList.dismiss();
                return false;
            }              
        });      
    }
  
    private void showToastMessage(String value)
    {
        Toast.makeText(ExpandableListViewDialog.this, value, Toast.LENGTH_LONG).show();
    }
  
    
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg){
          
            switch (msg.what) {
                   case 0:   //Success, refresh UI
                       /
package com.Anson.ExpandableListViewDialogDemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Color;
//import android.util.Log;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    Activity activity;
    List<String> listGroup = new ArrayList<String>();
    List<List<String>> listChild = new ArrayList<List<String>>();
          
    private int _posGroup = 0;
    private int _posChild = 0;
  
    public MyExpandableListAdapter(Activity a, List<String> group, List<List<String>> children){
        super();
        activity = a;
        listGroup = group;
        listChild = children;
        //Log.v("LH","@MyExpandableListAdapter: ");
    }
  
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        //Log.v("LH", listChild.get(groupPosition).get(childPosition));
        return listChild.get(groupPosition).get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        Log.v("LH", "ChildID: " + childPosition);      
        _posGroup = groupPosition;
        _posChild = childPosition;
        return childPosition;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        //Log.v("LH", "ChildrenCount: " + groupPosition);
        return listChild.get(groupPosition).size();
    }
  
    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {      
        String string = listChild.get(groupPosition).get(childPosition);
      
        //Log.v("LH","@getChildView: " + string);      
        View view = getGenericView(string);
              
        TextView text = (TextView) view;
      
        if(this._posGroup==groupPosition &&
                   this._posChild==childPosition)         
                {
                    text.setTextColor(Color.WHITE);
                    text.setBackgroundResource(R.drawable.bg_toolbar);
                }
      
        return view;
    }


    //group method stub
    @Override
    public Object getGroup(int groupPosition) {
        //Log.v("LH", listGroup.get(groupPosition));
        return listGroup.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        //Log.v("LH", "GroupCount: " + listGroup.size());
        return listGroup.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        Log.v("LH", "GroupID: " + groupPosition);
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {      
        String string = listGroup.get(groupPosition);      
        //Log.v("LH","@getGroupView: " + string);
        return getGenericView(string);
    }

    //View stub to create Group/Children's View
    public TextView getGenericView(String s) {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT, 64);

        lp.height=36;
        TextView text = new TextView(activity);
        text.setLayoutParams(lp);
        // Center the text vertically
        text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        text.setPadding(36, 0, 0, 0);
        text.setTextColor(Color.BLACK);      
        text.setText(s);
              
        return text;
    }
  
    @Override
    public boolean hasStableIds() {      
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {      
        return true;
    }      
}

========
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" android:background="@color/White">

    <TextView android:id="@+id/textView002" android:layout_width="fill_parent"
        android:layout_height="20dip" android:text="" />

    <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/absTest" android:layout_width="fill_parent"
        android:layout_height="50dip">
        <TextView android:id="@+id/textView1"
            android:layout_width="66dip" android:layout_height="40dip"
            android:text="Selected: " android:paddingTop="10dip" android:paddingLeft="10dip"
            android:textSize="14sp" android:textColor="@color/Black" />
        <EditText android:id="@+id/editText1" android:text=""
            android:layout_x="70dip" android:layout_width="160dip"
            android:layout_height="40dip" android:textSize="14sp"
            android:editable="false" />
        <Button android:id="@+id/btnShowDialog"
            android:layout_width="66dip" android:layout_height="36dip"
            android:text="Show" android:layout_x="236dip" android:textSize="14sp"
            />
    </AbsoluteLayout>
</LinearLayout>


========
expandablelist.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="vertical"
    android:id="@+id/LinearLayoutGetList"
    android:background="@color/White">
<ExpandableListView  
    android:id="@+id/elvForDialog"
    android:cacheColorHint="#00000000"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" />
</LinearLayout>
  • 大小: 198.2 KB
分享到:
评论
3 楼 爪哇岛岛主 2011-04-27  
楼主继续学习啊
2 楼 sexy22 2011-04-26  
感谢分享。
1 楼 贫僧不吃肉 2011-04-23  
楼主辛苦了

相关推荐

    Android 利用dialog弹出 二级下拉列表 ExpandableListView+DialogLI

    Android 利用dialog弹出 二级下拉列表 ExpandableListView+DialogLI。 利用dialog和ExpandableListView实现的一个弹出二级菜单项,并进行了封装,可在activity和fragment中随意调用。简单实用,兼容性好。 二级列表

    dialog弹出 二级下拉列表 ExpandableListView+Dialog

    在Android开发中,有时我们需要创建具有复杂交互的对话框,例如包含多级选择的下拉列表。本示例中,我们将探讨如何利用`ExpandableListView`结合`Dialog`来实现一个二级下拉列表功能。`ExpandableListView`是Android...

    Drawerlayout+ExpandableListView+,Fragment+Viewpager

    本资源在底层Drawerlayout中嵌套了ExpandableListView,同时兼具Fragment+Viewpager的功能。ExpandableListView自定义了group和item图片和文字,看起来效果还凑合

    利用dialog弹出 二级下拉列表 ExpandableListView+DialogLI

    在Android开发中,有时我们需要创建一个可扩展的二级下拉列表来展示层次结构的数据,例如菜单、选项或者分类。在这种情况下,我们可以利用`Dialog`和`ExpandableListView`结合使用来实现这一功能。`Dialog`作为...

    Android ExpandableListView+PopupWindow+json

    在Android开发中,`ExpandableListView`和`PopupWindow`是两种常见的UI组件,它们各自在不同的场景下发挥着重要作用。`ExpandableListView`用于展示层次结构的数据,而`PopupWindow`则是一种轻量级的弹出窗口,常...

    Android的ExpandableListView+CheckBox全选

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,每个分组下可以包含多个子项。这种控件在显示层次结构数据时非常实用。`CheckBox`则是另一种常见的组件,用于让用户进行多选...

    Android 源码开源 Expandablelistview实现,仿QQ 人员列表,聊天的实现,包括图片,语音 自制Shape

    Android 源码开源 Expandablelistview实现,仿QQ 人员列表,聊天的实现,包括图片,语音 自制Shape Android 源码开源 Expandablelistview实现,仿QQ 人员列表,聊天的实现,包括图片,语音 自制Shape Android 源码...

    expandablelistview + gridview + 手势的新闻客户端

    总的来说,"expandablelistview + gridview + 手势的新闻客户端"是一个综合性的项目,涵盖了Android开发中的多个核心技术和最佳实践。理解并掌握这些知识点,对于提升Android开发技能和构建高效、用户友好的应用至关...

    ExpandableListView+CheckBox多选功能

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,每一组下还可以包含多个子项,非常适合展示层次结构的数据。`CheckBox`则是用来实现多选功能的关键组件,通常与`ListView`或`...

    Android Expandablelistview +CheckBox

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许我们展示层次结构的数据,类似于树形结构。`ExpandableListView`不仅支持分组(Group)和子项(Child)的概念,还允许用户交互,比如点击展开或折叠...

    ExpandablelistView+swipeLayout实现的滑动删除效果

    在Android开发中,为了提供丰富的用户交互体验,开发者经常需要实现各种创新的界面效果。"ExpandableListView+SwipeLayout实现的滑动删除效果"就是一个很好的示例,它结合了ExpandableListView的分组展开功能与...

    expandablelistview+自定义adapter+listview字母排序

    在Android开发中,ExpandableListView是一个非常实用的控件,它可以显示可展开和折叠的列表项,常用于呈现层级结构的数据。在这个特定的示例中,“expandablelistview+自定义adapter+listview字母排序”是为了展示...

    ExpandableListView+CheckBox+RadioButton

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许我们展示可折叠的列表,其中每个组(Group)可以包含多个子项(Child)。这样的布局方式在展示层次结构数据时非常有效,例如菜单、目录或者树状结构...

    ExpandAbleListView+checkbox数组方式级联,点击选择顶部文本显示,可删除

    ExpandAbleListView+checkbox数组方式级联,外层列表可展开收起,内层列表使用checkbox多选框,点击之后可在顶部的gridlayout显示,顶部显示的选中与checkbox选中状态关联,点击顶部选中的item,可取消选中状态,...

    Android开发丶ExpandableListView实现可展开列表

    在Android开发中,`ExpandableListView`是一种非常实用的列表控件,它允许用户通过点击条目来展开或折叠子列表。这个控件是`ListView`的扩展,提供了更丰富的交互性和展示层次结构数据的能力。在本文中,我们将深入...

    ExpandableListView实现购物车页面

    在Android应用开发中,"ExpandableListView实现购物车页面"是一个常见的需求,它涉及到用户界面设计、数据管理和交互。ExpandableListView是Android SDK提供的一种可扩展的列表视图,允许用户展示分组数据,每组内...

    Android开发丶ExpandableListView嵌套GridView的实现

    在Android应用开发中,经常会遇到需要展示层次结构数据的情况,这时`ExpandableListView`是一个非常实用的组件。它允许我们创建可展开/折叠的列表,显示分层信息。然而,有时候我们可能还需要在每个可展开的组内嵌套...

    android ExpandableListView子集异步加载+IphoneTreeView

    在Android开发中,`ExpandableListView`是一种常用的控件,它可以展示可折叠的列表,具有层级结构,非常适合处理分类数据。而"android ExpandableListView子集异步加载+IphoneTreeView"这个主题主要关注如何在`...

    ExpandableListView+SwipeItem

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,展示层次结构的数据。结合`SwipeItem`的功能,我们可以实现类似滑动删除的效果,为用户提供更加直观和便捷的操作体验。下面我们...

    Android代码-基于ExpandableListView实现评论和回复的功能。

    CommentWithReplyView-master 基于ExpandableListView实现评论和回复的功能。 &gt; 说明 ...处理了NestedScrollView、ExpandableListView和CoordinatorLayout的嵌套问题 点击某条评论,即可@ta进行回复

Global site tag (gtag.js) - Google Analytics