2014-2-12AdapterView及其子类2

1.网格视图(GridView)

GridView用于在界面上按行、列分布的方式来显示多个组件。

       GridView和ListView有共同的父类:AbsListView,所以它们有很高的相似性。ListView相当于一种特殊的GridView。

       GridView也需要Adapter来提供显示的数据。

实例:带预览的图片浏览器

界面布局文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    >
    <!-- 定义一个GridView组件 -->
    <GridView
        android:id="@+id/grid1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:horizontalSpacing="1pt"
        android:verticalSpacing="1pt"
        android:numColumns="4"
        android:gravity="center"
        ></GridView>
    <!-- 定义一个ImageView组件 -->
    <ImageView
        android:id="@+id/image1"
        android:layout_width="240dp"
        android:layout_height="240dp"
        android:layout_gravity="center_horizontal"
        />
</LinearLayout>

PS:以上代码简单定义了一个GridView、一个ImageView。属性androidnumColumns=4

意味着网格包含4列,行数由Adapter决定。

Activity代码清单:

public class GridViewT extends Activity {
 
    GridView grid1;
    ImageView image1;
    int[] imageIds = new int[]
            {
            R.drawable.p00, R.drawable.p01, R.drawable.p02,
            R.drawable.p03, R.drawable.p04, R.drawable.p05,
            R.drawable.p06, R.drawable.p07, R.drawable.p08,
            R.drawable.p09, R.drawable.p10, R.drawable.p11
            };
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grid_view_t);
        //创建一个List对象,List对象的元素是Map
        List<Map<String, Object>>listItems =
                new ArrayList<Map<String,Object>>();
        for(int i = 0; i< imageIds.length; i++)
        {
            Map<String, Object> listItem =new HashMap<String, Object>();
            listItem.put("image", imageIds[i]);
            listItems.add(listItem);
        }
        //获取显示图片的ImageView
        image1 = (ImageView) findViewById(R.id.image1);
        image1.setImageResource(imageIds[0]);
        //创建SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this,
                listItems,
                //使用cell.xml文件作为界面布局
                R.layout.cell, new String[] {"image"},
                new int[]{R.id.image});
        grid1 = (GridView) findViewById(R.id.grid1);
        grid1.setAdapter(simpleAdapter);
        //添加列表项被选中的监听器
        grid1.setOnItemSelectedListener(new OnItemSelectedListener()
        {
 
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // 显示当前被选中的图片
                image1.setImageResource(imageIds[position + 1]);
            }
 
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
               
            }          
        });
        //添加列表项被单击的监听器
        grid1.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                //显示被单击的图片
                image1.setImageResource(imageIds[position]);
            }
           
        });
    }
}


Ps:在layout目录下定义一个cell.xml界面布局,包含一个简单ImageView组件。

显示效果:

2.可展开的列表组件(ExpandableListView)

ExpandableListViewListView的子类,它把应用中的列表项分成几组,每组里又可包含多个列表项。列表项由ExpandableListAdapter提供。

       实例:

界面布局文件:在LinearLayout内定义一个ExpandableListView

Activity代码清单:

public class ExpandableLiestViewT extends Activity {
 
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandable_liest_view_t);
        //创建一个BaseExpandableListAdapter对象
        ExpandableListAdapter adapter = new BaseExpandableListAdapter()
        {
            int[] logos = new int[]
                    {
                    R.drawable.p,
                    R.drawable.z,
                    R.drawable.t
                    };
            private String[] armTypes = new String[]
                    {"神族兵种", "虫族兵种", "人族兵种"};
            private String[][] arms = new String[][]
                    {
                    {"狂战士", "龙骑士", "黑暗圣堂", "闪电兵"},
                    {"天狗", "刺蛇", "飞龙", "自爆精灵"},
                    {"机枪兵", "护士mm", "幽灵"},
                    };
            //获取指定组件位置、指定子列表处的子列表数据
            @Override
            public Object getChild(int groundPosition, int childPosition)
            {
                return arms[groundPosition][childPosition];
            }
            @Override
            public long getChildId(int groupPosion, int childPosion)
            {
                return childPosion;
            }
            @Override
            public int getChildrenCount(int groupPosition){
                return arms[groupPosition].length;
            }
            private TextView getTextView()
            {
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textView = new TextView(ExpandableLiestViewT.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(36, 0, 0,0);
                textView.setTextSize(20);
                return textView;
            }
            //该方法决定每个子选项的外观
            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroupparent) {
                TextView textView =getTextView();
                textView.setText(getChild(groupPosition,childPosition).toString());
                return textView;
            }
            //获取指定组位置处的组数据
            @Override
            public Object getGroup(int groupPosition) {
                return armTypes[groupPosition];
            }
            @Override
            public int getGroupCount() {
                return armTypes.length;
            }
            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }
            //该方法决定每个组选项的外观
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroupparent) {
                LinearLayout ll = new LinearLayout(ExpandableLiestViewT.this);
                ll.setOrientation(0);
                ImageView logo = new ImageView(ExpandableLiestViewT.this);
                logo.setImageResource(logos[groupPosition]);
                ll.addView(logo);
                TextView textView =getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }
            @Override
            public boolean hasStableIds() {
                return true;
            }
            @Override
            public boolean isChildSelectable(int groupPosition,
                    int childPosition) {
                return true;
            }
        };
        ExpandableListView expandableListView =(ExpandableListView) findViewById
                (R.id.list);
        expandableListView.setAdapter(adapter);
    }
}

PS:上面代码通过扩展BaseExpandableListAdapter来实现ExpandableListAdapter, 扩展BaseExpandableListAdapter时关键有如下四个方法:

l      getGroupCount():该方法返回包含的组列表项的数量

l       getGroupView():该方法返回的View对象将作为组列表项

l      getChildrenCount():该方法返回特定组所包含的子列表项的数量

l       getChildView():该方法返回的View对象将作为特定组、特定位置的子列表项

由于在界面布局文件的ExpandableListView中添加了android:childIndicator="@drawable/ic_launcher"       所以在子列表项左边会有图标。

显示效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章