zoukankan      html  css  js  c++  java
  • Listview中显示不同的视图布局

    为了表示诚意,先上效果图再上源码,如今的技术文章没有demo,都是扯淡!!!!!!
    先看一张效果图:

    源码下载:http://files.cnblogs.com/files/fancing/BaseAdapterTest.rar.rar

    1.使用场景

      在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形。

    2.ListView包含不同Item的布局

    我们需要做这些工作:

      1)重写 getViewTypeCount() – 该方法返回多少个不同的布局

      2)重写 getItemViewType(int) – 根据position返回相应的Item

      3)根据view item的类型,在getView中创建正确的convertView

    3.案例

    import java.util.ArrayList; 
    import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.CheckBox; 
    import android.widget.ImageView; 
    import android.widget.LinearLayout; 
    import android.widget.ListView; 
    import android.widget.TextView; 
       
    public class listViewTest extends Activity { 
    /** Called when the activity is first created. */
      ListView listView; 
      MyAdapter listAdapter; 
      ArrayList<String> listString; 
       
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        listView = (ListView)this.findViewById(R.id.listview); 
        listString = new ArrayList<String>(); 
        for(int i = 0 ; i < 100 ; i++) 
        { 
          listString.add(Integer.toString(i)); 
        } 
        listAdapter = new MyAdapter(this); 
        listView.setAdapter(listAdapter); 
      } 
       
      class MyAdapter extends BaseAdapter{ 
        Context mContext; 
        LinearLayout linearLayout = null; 
        LayoutInflater inflater; 
        TextView tex; 
        final int VIEW_TYPE = 3; 
        final int TYPE_1 = 0; 
        final int TYPE_2 = 1; 
        final int TYPE_3 = 2; 
       
        public MyAdapter(Context context) { 
          // TODO Auto-generated constructor stub 
          mContext = context; 
          inflater = LayoutInflater.from(mContext); 
        } 
       
        @Override 
        public int getCount() { 
          // TODO Auto-generated method stub 
          return listString.size(); 
        } 
       
        //每个convert view都会调用此方法,获得当前所需要的view样式 
        @Override 
        public int getItemViewType(int position) { 
          // TODO Auto-generated method stub 
          int p = position%6; 
          if(p == 0) 
            return TYPE_1; 
          else if(p < 3) 
            return TYPE_2; 
          else if(p < 6) 
            return TYPE_3; 
          else
            return TYPE_1; 
        } 
       
        @Override 
        public int getViewTypeCount() { 
          // TODO Auto-generated method stub 
          return 3; 
        } 
       
        @Override 
        public Object getItem(int arg0) { 
          // TODO Auto-generated method stub 
          return listString.get(arg0); 
        } 
       
        @Override 
        public long getItemId(int position) { 
          // TODO Auto-generated method stub 
          return position; 
        } 
       
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
          // TODO Auto-generated method stub 
          viewHolder1 holder1 = null; 
          viewHolder2 holder2 = null; 
          viewHolder3 holder3 = null; 
          int type = getItemViewType(position); 
       
          //无convertView,需要new出各个控件 
          if(convertView == null) 
          {  
            Log.e("convertView = ", " NULL"); 
       
            //按当前所需的样式,确定new的布局 
            switch(type) 
            { 
            case TYPE_1: 
              convertView = inflater.inflate(R.layout.listitem1, parent, false); 
              holder1 = new viewHolder1(); 
              holder1.textView = (TextView)convertView.findViewById(R.id.textview1); 
              holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox); 
              Log.e("convertView = ", "NULL TYPE_1"); 
              convertView.setTag(holder1); 
              break; 
            case TYPE_2: 
              convertView = inflater.inflate(R.layout.listitem2, parent, false); 
              holder2 = new viewHolder2(); 
              holder2.textView = (TextView)convertView.findViewById(R.id.textview2); 
              Log.e("convertView = ", "NULL TYPE_2"); 
              convertView.setTag(holder2); 
              break; 
            case TYPE_3: 
              convertView = inflater.inflate(R.layout.listitem3, parent, false); 
              holder3 = new viewHolder3(); 
              holder3.textView = (TextView)convertView.findViewById(R.id.textview3); 
              holder3.imageView = (ImageView)convertView.findViewById(R.id.imageview); 
              Log.e("convertView = ", "NULL TYPE_3"); 
              convertView.setTag(holder3); 
              break; 
            } 
          }else{ 
            //有convertView,按样式,取得不用的布局 
            switch(type) 
            { 
            case TYPE_1: 
              holder1 = (viewHolder1) convertView.getTag(); 
              Log.e("convertView !!!!!!= ", "NULL TYPE_1"); 
              break; 
            case TYPE_2: 
              holder2 = (viewHolder2) convertView.getTag(); 
              Log.e("convertView !!!!!!= ", "NULL TYPE_2"); 
              break; 
            case TYPE_3: 
              holder3 = (viewHolder3) convertView.getTag(); 
              Log.e("convertView !!!!!!= ", "NULL TYPE_3"); 
              break; 
            } 
          } 
       
        //设置资源 
          switch(type) 
          { 
            case TYPE_1: 
              holder1.textView.setText(Integer.toString(position)); 
              holder1.checkBox.setChecked(true); 
              break; 
            case TYPE_2: 
              holder2.textView.setText(Integer.toString(position)); 
              break; 
            case TYPE_3: 
              holder3.textView.setText(Integer.toString(position)); 
              holder3.imageView.setBackgroundResource(R.drawable.icon); 
              break; 
          } 
       
          return convertView; 
        } 
      } 
       
      //各个布局的控件资源 
      class viewHolder1{ 
        CheckBox checkBox; 
        TextView textView; 
      } 
       
      class viewHolder2{ 
        TextView textView; 
      } 
       
      class viewHolder3{ 
        ImageView imageView; 
        TextView textView; 
      } 
    }

    参考2:http://www.tuicool.com/articles/MBvABz
    参考3:http://blog.csdn.net/xyz_lmn/article/details/13745489
    参考4:http://blog.sina.com.cn/s/blog_629b701e0100x338.html

  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/fancing/p/6394217.html
Copyright © 2011-2022 走看看