Android exercise 3

来源:互联网 发布:淘宝页面装修教程 编辑:程序博客网 时间:2024/04/30 05:05

Android exercise 3

1.    GridView

第一个要求是把上次的ListView改成GridView,这个其实不难,但是我对GirdView一点都不了解,所以调了一段时间,其实直接用GirdView替换掉ListView就可以了。

 

gridView = (GridView) findViewById(R.id.grid_view);

gridView.setAdapter(customAdapter);

gridView.setOnItemClickListener(new OnItemClickListener(){}

注意修改布局文件

<GridView

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:id="@+id/grid_view"

       android:numColumns="auto_fit"

       android:stretchMode="columnWidth">

    </GridView>

我开始把GridView写成了GirdLayout,调了半天也没调出结果。

 

2.    ViewPager的使用

这个东西挺复杂的,我的一个foodView就用了三层布局,6,7个布局文件。

我大概总结一下写法:

//创建实例,这个每个活动都有的       

super.onCreate(savedInstanceState);

//获取当前布局,进行编辑

        LayoutInflater inflater =getLayoutInflater();

//创建一个pageView,准备以后嵌入

        pageViews = newArrayList<View>();

//加入pageView中的四个页

        View pageHot =inflater.inflate(R.layout.page_hot,null);

        View pageCold =inflater.inflate(R.layout.page_cold,null);

        View pageSeaFood =inflater.inflate(R.layout.page_seafood,null);

        View pageWine =inflater.inflate(R.layout.page_wine,null);

        pageViews.add(pageHot);

        pageViews.add(pageCold);

        pageViews.add(pageSeaFood);

        pageViews.add(pageWine);

 

//获取四个页面中的ListView,并往ListView中加适配器

        lvHot =(ListView)pageHot.findViewById(R.id.list_hot);

        lvCold =(ListView)pageCold.findViewById(R.id.list_cold);

        lvSeaFood =(ListView)pageSeaFood.findViewById(R.id.list_seafood);

        lvWine =(ListView)pageWine.findViewById(R.id.list_wine);

        listData = getListData();

        lvHot.setAdapter(newCustomAdapter(this, LayoutInflater.from(this),HOT));

        lvCold.setAdapter(newCustomAdapter(this, LayoutInflater.from(this),COLD));

        lvSeaFood.setAdapter(new CustomAdapter(this,LayoutInflater.from(this),SEAFOOD));

        lvWine.setAdapter(newCustomAdapter(this, LayoutInflater.from(this),WINE));

     //获取pageView中的button,并对它们设置监听器

            <Button

               android:id="@+id/seafood"

                android:layout_width="wrap_content"

               android:layout_height="50dp"

               android:layout_weight = "1"

               android:textSize="18sp"

               android:textColor="@android:color/black"

               android:text="海鲜"

                android:padding="7dp"

               android:textStyle="bold"

                />

        buttons = new Button[pageViews.size()];

        buttonsLine =(ViewGroup)inflater.inflate(R.layout.food_view,null);

        hot = (Button)buttonsLine.findViewById(R.id.hot);

        cold =(Button)buttonsLine.findViewById(R.id.cold);

        seaFood =(Button)buttonsLine.findViewById(R.id.seafood);

        wine =(Button)buttonsLine.findViewById(R.id.wine);

        buttons[HOT]=hot;

        buttons[COLD]=cold;

        buttons[SEAFOOD]=seaFood;

        buttons[WINE]=wine;

        hot.setOnClickListener(newGuideButtonClickListener(HOT));

        cold.setOnClickListener(newGuideButtonClickListener(COLD));

        seaFood.setOnClickListener(newGuideButtonClickListener(SEAFOOD));

        wine.setOnClickListener(newGuideButtonClickListener(WINE));

//把buttons加入到pageView中

        viewPager =(ViewPager)buttonsLine.findViewById(R.id.guidePages);

        setContentView(buttonsLine);

//为viewPage添加适配器和监听器

        viewPager.setAdapter(newGuidePageAdapter());

        viewPager.setOnPageChangeListener(newGuidePageChangeListener());

 

这是为上面复写的一些适配器,可以看出这个viewPager真的非常复杂

    class GuidePageAdapter extends PagerAdapter{

        @Override

        public int getItemPosition(Objectobject) {

            returnsuper.getItemPosition(object);

        }

 

        @Override

        public void destroyItem(ViewGroupcontainer, int position, Object object) {

           ((ViewPager)container).removeView(pageViews.get(position));

        }

 

        @Override

        public Object instantiateItem(Viewcontainer, int position) {

           ((ViewPager)container).addView(pageViews.get(position));

            return pageViews.get(position);

        }

 

        @Override

        public int getCount() {

            return pageViews.size();

        }

 

        @Override

        public boolean isViewFromObject(Viewview, Object object) {

            return view==object;

        }

    }

 

    class GuidePageChangeListener implementsViewPager.OnPageChangeListener {

        @Override

        public void onPageScrolled(intposition, float positionOffset, int positionOffsetPixels) {

 

        }

 

        @Override

        public void onPageSelected(intposition) {

        }

 

        @Override

        public voidonPageScrollStateChanged(int state) {

 

        }

    }

    class GuideButtonClickListener implementsView.OnClickListener {

        private int index = 0;

 

        public GuideButtonClickListener(int i){

            index = i;

        }

 

        public void onClick(View v)

        {

           viewPager.setCurrentItem(index,true);

        }

    }

}

 

3.    数据的问题

由于布局有了三层,所以数据也有了三层,在保存数据的时候我也遇到了一些问题。

开始的时候我是用的List<List<HashMap<String,Object>>>,然后发现无法申请实例,经过查找资料,我发现第二层得用实际的泛型,所以我最后是使用了

List<ArrayList<HashMap<String, Object>>>

勉强能用。

       List<ArrayList<HashMap<String, Object>>> listData =new ArrayList<ArrayList<HashMap<String, Object>>>();

 

       HashMap<String, Object> item = null;

       ArrayList<HashMap<String,Object>> itemList = null;

       for (int i=0;i<4;i++) {

            itemList= new ArrayList<HashMap<String, Object>>();

            for (intj = 0; j < 3; j++) {

                item= new HashMap<String, Object>();

               item.put("name", itemName[i][j]);

               item.put("price", "价格:"+itemPrice[i][j]);

               itemList.add(item);

            }

           listData.add(itemList);

       }

       return listData;

}

 

 

 

4.    ActionBar的问题

写这个actionBar我也花了不少时间。网上的资料写得非常一般。

其实只需要修改两个地方,这个是原来的菜单所在的地方。

 

   public booleanonCreateOptionsMenu(Menu menu) {

        MenuInflater inflater= getMenuInflater();

       inflater.inflate(R.menu.food_view_menu,menu);

        return true;

    }

但是,如果只写onCreateOptionsMenu的话,在界面中是不会出现ActionBar的,我们需要做的修改是theme,把主题修改之后,我们才能在界面中看到ActionBar,从而点击到我们编辑的ActionBar,我当时找了四五个文档,没一个文档说清楚这件事的,全都在扯什么版本什么什么玩意,一点用都没有,实际上就是加上theme的设置就可以了。

<activity android:name=".FoodView"

           android:theme="@android:style/Theme.Holo.Light"></activity>

 

5.    一个页面中ListView加别的组件

这次作业的FoodOrderView要求在一个页面中包含ListView和两个TextView再加一个Button,实际上直接加的可以了,要注意的是每一个组件的高度,如果高度没写好,页面出来以后会非常难看。

 

    <ListView

       android:layout_marginTop="50dp"

       android:id="@+id/list_ordered"

        android:layout_width="wrap_content"

       android:layout_height="400dp">

    </ListView>

 

    <TextView

       android:id="@+id/ordered_totoal_number"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

        android:textSize="18sp"

        android:text="菜单总数"/>

    <TextView

       android:id="@+id/ordered_total_price"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:textSize="18sp"

        android:text="订单总价"/>

    <Button

       android:id="@+id/ordered_total_button"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

        android:text="结账"/>

 

注意到layout_height全部都写的wrap_content,因为如果不这样写的话,看起来文子与画面就会不匹配。

 

6.通过Intent传递类

这个还是有点复杂的,我在这个地方记录一下吧。

保存数据的时候:

 

 Bundle bundle = new Bundle();

 bundle.putSerializable("user",user);

 intent.putExtras(bundle);

获取类的时候:

 

user = (User)intent.getSerializableExtra("User");

 

 

Exercise3还是非常复杂的,光是要求6就做了半天。最后总算是在截止期限之前完成了,非常不容易。

1 0
原创粉丝点击