Activity在GridView和ListView之间切换使用一个布局实现的方法
2012-12-15 16:09
746 查看
对于一个界面,如果需要设计GridView和ListView两种方式来显示一个列表可以共用一个Adapter和一个布局来实现,这样既可以避免冗余的代码,也使整个处理过程变得更加简单。
1. 首先,如下所示,将GridView和ListView布局到同一个页面中;
使用同一个adapter填充数据:
其次,在acticity中获取相应的对象,同时设定一个标签,用于标记当前是需要用GridView或ListView中哪种方式显示;然后将数据填充到相应的View中。代码如下:
通过控制isGridView标签来控制页面的显示。
1. 首先,如下所示,将GridView和ListView布局到同一个页面中;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/app_title" android:layout_width="fill_parent" android:layout_height="44dip" android:text="@string/main_service_title" android:gravity ="center" android:textSize="27px" android:textColor="#ffffff" android:background ="@drawable/title_bar"/> <GridView android:id="@+id/app_grid" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:padding="10dp" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:numColumns="4" android:columnWidth="60dp" android:stretchMode="columnWidth" android:gravity="center"/> <ListView android:id="@+id/app_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:divider="@drawable/divider"/> </LinearLayout>
使用同一个adapter填充数据:
public class ServiceZoneAdapter extends BaseAdapter { /** * Get view from xml layout. */ private LayoutInflater mInflater = null; /** * A list to encapsulate servcie information. */ private List<ServiceBean> mServiceBeans = null; public ServiceZoneAdapter(Context c, List<ServiceBean> serviceBeans) { mServiceBeans = serviceBeans; mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } /** * Get list's size. * * @return the size of list. */ public int getCount() { return mServiceBeans == null ? 0 : mServiceBeans.size(); } /** * Get item. * * @param position * @return the item according to the position. */ public Object getItem(int position) { return mServiceBeans == null ? null : mServiceBeans.get(position); } /** * Get id. * * @param position * @return the item's id according to the position. */ public long getItemId(int position) { return position; } /** * Get item's view. * * @return the item view according to the position. */ public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { if (ServiceZone.isGridView) { convertView = mInflater.inflate(R.layout.each_app_grid_layout, parent, false); } else { convertView = mInflater.inflate(R.layout.each_app_list_layout, parent, false); } } ServiceBean service = (ServiceBean)getItem(position); if (service == null) { return convertView; } ImageView imageView = (ImageView)convertView.findViewById(R.id.app_icon); TextView text = (TextView)convertView.findViewById(R.id.app_name); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); imageView.setImageResource(service.getIconId()); text.setText(service.getName()); return convertView; } }
其次,在acticity中获取相应的对象,同时设定一个标签,用于标记当前是需要用GridView或ListView中哪种方式显示;然后将数据填充到相应的View中。代码如下:
public static Boolean isGridView = true; /** * Update the layout. */ private void updateLayout() { if (isGridView) { if (mGridView == null) { mGridView = (GridView)findViewById(R.id.app_grid); } mGridView.setVisibility(View.VISIBLE); mGridView.setAdapter(new ServiceZoneAdapter(ServiceZone.this, mService)); mGridView.setOnItemClickListener(this); mListView.setVisibility(View.GONE); if (mSelectionPosition < 0) { mSelectionPosition = 0; } mGridView.setSelection(mSelectionPosition); } else { if (mListView == null) { mListView = (ListView)findViewById(R.id.app_list); } mListView.setVisibility(View.VISIBLE); mListView.setAdapter(new ServiceZoneAdapter(ServiceZone.this, mService)); mListView.setOnItemClickListener(this); mGridView.setVisibility(View.GONE); if (mSelectionPosition < 0) { mSelectionPosition = 0; } mListView.setSelection(mSelectionPosition); } }
通过控制isGridView标签来控制页面的显示。
/** * Update ui to be the selected style. */ @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_change) { isGridView = !isGridView; updateLayout(); } return super.onOptionsItemSelected(item); }
相关文章推荐
- Android实现在一个activity中添加多个listview的方法
- listview,gridview里面通过一个item控制所有item的使用方法
- ReactNative基础(四)了解ListView的使用、实现GridView效果、编写一个真实网络请求案例
- 手势检测实现相册的左右滑动(并加上移动与旋转的特效) 首先,activity_main.xml里,使用ViewFlipper组件(可使用动画控制多个组件之间的切换效果) <?xml version="
- ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法
- android中很多情况下我们需要会使用多个fragment,我们这时就需要一个showFragment来实现fragment之间的切换
- RecyclerView实现listview+GridView之间切换的小demo
- Android编程实现两个Activity相互切换而不使用onCreate()的方法
- Listview控件使用SimpleAdapter适配器实现屏幕下滑增加一个item选项以及用到的方法总结
- 【从头学android】第二个程序同一个Activity中,切换布局时监听器失效解决方法1
- 【Android】使用Intent实现Activity之间的跳转(创建一个Activity的过程)
- 安卓控件使用系列29:TabHost卡片的使用方法2不继承TabActivity、TabHost控件、一个布局文件
- android 切换到有ScrollView +Gridview 或者listview 布局的Activity时会上拉一点
- ReactNative基础(四)了解ListView的使用、实现GridView效果、编写一个真实网络请求案例
- ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法
- Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法
- Android 使用LinearLayout.getChildAt(i)获取一个线性布局的view,并实现content中实现方法
- 使用多态来实现数据库之间的切换
- ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:
- Android 一个Activity 里面放置多个 Fragment 实现点击切换的Tab 页面效果