您的位置:首页 > 其它

Activity在GridView和ListView之间切换使用一个布局实现的方法

2012-12-15 16:09 746 查看
对于一个界面,如果需要设计GridView和ListView两种方式来显示一个列表可以共用一个Adapter和一个布局来实现,这样既可以避免冗余的代码,也使整个处理过程变得更加简单。

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);
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐