344
技術社區[雲棲]
Activity在GridView和ListView之間切換使用一個布局實現的方法
對於一個界麵,如果需要設計GridView和ListView兩種方式來顯示一個列表可以共用一個Adapter和一個布局來實現,這樣既可以避免冗餘的代碼,也使整個處理過程變得更加簡單。
1. 首先,如下所示,將GridView和ListView布局到同一個頁麵中;
<LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android: 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: 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: 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); }
最後更新:2017-04-02 22:15:46