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