閱讀344 返回首頁    go 技術社區[雲棲]


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

  上一篇:go 喬布斯17年前預言:毀滅蘋果的將是貪婪
  下一篇:go ListView飛入加載item及滑動刪除item