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

简介:

对于一个界面,如果需要设计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);
	}



相关文章
|
Web App开发 前端开发 JavaScript
Google IO 2022——CSS 状态(上)
Google IO 2022——CSS 状态
123 0
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
12月前
|
Shell Linux
10-20|修改当前时间
10-20|修改当前时间
|
算法 前端开发 JavaScript
前端开发:JS中使用到的贪心算法场景
在前端开发过程中,除了一般的逻辑使用之外,也会涉及到算法相关的知识,比如冒泡排序、数组去重/合并、贪心算法、八皇后算法等等,这些都是比较常用的前端算法相关的知识点。关于前端实际开发中用到的算法,虽然没有后端要求的那么多,但是也有比较重要的算法知识,本篇博文就来分享一下关于贪心算法的相关知识点,记录一下,方便查阅使用。
365 1
前端开发:JS中使用到的贪心算法场景
|
存储 Shell Perl
|
缓存 Oracle 关系型数据库
查看内存使用情况
查看内存使用情况 1.top “2 users”为当前登录到系统的用户,更确切的说是登录到用户的终端数 -- 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目; “load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程; 第五行(Swap)表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。
1047 0
|
3天前
|
人工智能 运维 安全
|
1天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!