本帖最后由 cunlingwang 于 2013-01-22 17:42:58 编辑

解决方案 »

  1.   

    holder设置内容的代码得放到 if else 外面,不能只在if里面执行
      

  2.   


    谢谢。上面已经改了,但是如何建一个ArrayList<>  是什么类型的才可以把这三种不同类型的都放进入?
    请知道的人指点一下。
      

  3.   

    getViewTypeCount如果为3,就可以放置3个不同的item。
    同时这getView的时候,区分这三种Item,分别加载不同的xml文件即可。
      

  4.   

    我这有个例子http://download.csdn.net/detail/piaohong/5020778
      

  5.   


    是的,现在就是这个样子,现在主要是如何在Activity中显示的问题。
      

  6.   

    你的例子是可行的,但是我想:大家一般都是采用我上面写的这种做法,难道做不出来吗?好像就差那么一点了。呵呵。
    只是见到例子用perferenceActivity,那个seekbar不能拖动,也不能在本页面添加大图片,所以就没有用。
      

  7.   

    ArrayList<MyObject>class MyObject {
        int resId;
        ......
        ......
    }
      

  8.   


    我那个例子跟你那个写法有什么不同吗?
    就改进了 viewHolder_switch viewHolder_seekbar 等,你那种写法每个不同的列表项都要定义一个viewHolder。我搞了一个ViewHolder适合所有的不同的列表项另外增加了一个类ListItem(封装了一个Map及mType),为的就是解决“如何建一个ArrayList<>  是什么类型的才可以把这三种不同类型的都放进入”
      

  9.   

    下面是根据大家的意见修改的。没有大改。
    实现的界面如下:三种类型public class MainActivity extends Activity { private final int TYPE_SWITCH   = 0;
    private final int TYPE_SEEKBAR  = 1;
    private final int TYPE_BUTTON   = 2;
    private static final String[] led_opt={
    "江苏","广州","新疆","台湾"
    };
    private static final String[] led_optContext={
    "华东地区","位于东南沿海","一个遥远的地方","隔海相望"
    };

    List<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();
    MyAdapter listAdapter ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    //setTheme(16974123);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
       
        {
         ListView lv = (ListView) this.findViewById(R.id.listview_home);    
        
         Map<String, Object> map;
         /*
          * 电源开关
          */ 
         map = new HashMap<String, Object>();
         map.put("img",R.drawable.power_ico_50dp);
         map.put("title",led_opt[0]);
         map.put("info",led_optContext[0]);     
         mData.add(map);
        
         map = new HashMap<String, Object>();
         map.put("img",R.drawable.white_ico_50dp);
         map.put("title",led_opt[1]);
         map.put("info",led_optContext[1]);     
         mData.add(map);      map = new HashMap<String, Object>();
         map.put("img",R.drawable.rgb_ico_50dp);
         map.put("title",led_opt[2]);
         map.put("info",led_optContext[2]);     
         mData.add(map);
        
         map = new HashMap<String, Object>();
         map.put("img",R.drawable.dream_ico_50dp);
         map.put("title",led_opt[3]);
         map.put("info",led_optContext[3]);     
         mData.add(map);
        
         listAdapter = new MyAdapter(this);     
         lv.setAdapter(listAdapter);
    }    
    }       ……………………
          ……………………  …………
      …………/**
     * 自定义一个Adapter(实现了ListAdapter接口)
     * 
     * @author Administrator
     * 
     */
    class MyAdapter extends BaseAdapter{ LayoutInflater inflater = null;        public MyAdapter(Context context) {     this.inflater = LayoutInflater.from(context);
        //inflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }      @Override
             public int getCount() {
             // TODO Auto-generated method stub
          return mData.size();}         //每个convert view都会调用此方法,获得当前所需要的view样式
             @Override
         public int getItemViewType(int position) {
         // TODO Auto-generated method stub          
         int p = position%4;
         if(p == 0)
             return TYPE_SWITCH;
         else if(p == 1)
          return TYPE_SEEKBAR;
         else if(p == 2)
          return TYPE_SEEKBAR;
         else if(p == 3)
          return TYPE_BUTTON;
         else 
          return 0;
         }         @Override
             public int getViewTypeCount() {
              // TODO Auto-generated method stub
              return 3;
             }         @Override
             public Object getItem(int position) {
              // TODO Auto-generated method stub
              //return mData.get(arg0);
              return position;
             }         @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      
           
              viewHolder_switch holder_switch = null;
              viewHolder_seekbar holder_seekbar = null;
              viewHolder_button holder_button = null;
              
              int type = getItemViewType(position);
              
              if (convertView == null)
              {
             Log.e("convertView = ", " NULL");              switch(type)
                  {
                  case TYPE_SWITCH:
                   
                   
                   holder_switch = new viewHolder_switch();
                   convertView = inflater.inflate(R.layout.listview_switch_row, parent, false);
                  // convertView = inflater.inflate(R.layout.listview_switch_row,null);
                   //
                   holder_switch.img = (ImageView)convertView.findViewById(R.id.img_sw);
                   holder_switch.title = (TextView)convertView.findViewById(R.id.title_sw);
                   holder_switch.info = (TextView)convertView.findViewById(R.id.info_sw);
                   Log.e("convertView = ", "NULL TYPE_SWITCH");  
                   
                   convertView.setTag(holder_switch);              
                   
                   
                   break;
                  case TYPE_SEEKBAR:         
                   
                   
                   convertView = inflater.inflate(R.layout.listview_seekbar_row, parent, false);
                  
                   holder_seekbar = new viewHolder_seekbar();
                   holder_seekbar.img = (ImageView)convertView.findViewById(R.id.img_sb);
                   holder_seekbar.title = (TextView)convertView.findViewById(R.id.title_sb);
                   holder_seekbar.info = (TextView)convertView.findViewById(R.id.info_sb);
                   Log.e("convertView = ", "NULL TYPE_SEEKBAR");
                  
                   
                   convertView.setTag(holder_seekbar);
                   break;               
                  case TYPE_BUTTON:
                   
                   convertView = inflater.inflate(R.layout.listview_button_row, parent, false);
                   holder_button = new viewHolder_button();
                   holder_button.img = (ImageView)convertView.findViewById(R.id.img_btn);
                   holder_button.title = (TextView)convertView.findViewById(R.id.title_btn);
                   holder_button.info = (TextView)convertView.findViewById(R.id.info_btn);
                   Log.e("convertView = ", "NULL TYPE_BUTTON");
                   
                   convertView.setTag(holder_button);
    break;
                  }
              }else{
    //有convertView,按样式,取得不用的布局
    switch(type)
    {
    case TYPE_SWITCH:
    holder_switch = (viewHolder_switch) convertView.getTag();
    Log.e("convertView !!!!!!= ", "NULL TYPE_SWITCH");
    break;
    case TYPE_SEEKBAR:
    holder_seekbar = (viewHolder_seekbar) convertView.getTag();
    Log.e("convertView !!!!!!= ", "NULL TYPE_SEEKBAR");
    break;
    case TYPE_BUTTON:
    holder_button = (viewHolder_button) convertView.getTag();
    Log.e("convertView !!!!!!= ", "NULL TYPE_BUTTON");
    break;
    }
     }          //设置资源
              switch(type)
             {
    case TYPE_SWITCH:
                   holder_switch.img.setBackgroundResource((Integer)mData.get(position).get("img"));
      holder_switch.title.setText((String)mData.get(position).get("title"));
      holder_switch.info.setText((String)mData.get(position).get("info"));
      //holder_switch.Switch.setChecked(true);  
    break;
     case TYPE_SEEKBAR:
                  
    holder_seekbar.img.setBackgroundResource((Integer)mData.get(position).get("img"));
    holder_seekbar.title.setText((String)mData.get(position).get("title"));
    holder_seekbar.info.setText((String)mData.get(position).get("info")); 

    break;
              case TYPE_BUTTON:
      holder_button.img.setBackgroundResource((Integer)mData.get(position).get("img"));
      holder_button.title.setText((String)mData.get(position).get("title"));
      holder_button.info.setText((String)mData.get(position).get("info"));
    break;
      }
              
    return convertView;
       }
       } //各个布局的控件资源
    class viewHolder_switch{
    /** 布局ID */
    public int layoutID; /** 图片ID */
    public ImageView img; /** 标题 */
    public TextView title; /** 内容 */
    public TextView info;
    /* switch*/
    public Switch Switch;


     
    } class viewHolder_seekbar{
    /** 布局ID */
    public int layoutID; /** 图片ID */
    public ImageView img; /** 标题 */
    public TextView title; /** 内容 */
    public TextView info; public SeekBar sb;

    } class viewHolder_button
    { private int layoutID; private ImageView img; /** 标题 */
    private TextView title; /** 内容 */
    private TextView info; /** 按钮名称 */
    private Button button;


    }  
    }
      

  10.   

    seekBar 按钮这些控件的监听怎么没了
      

  11.   

    如果viewHolder_switch,viewHolder_seekbar,viewHolder_button的成员个数不一样,程序运行会崩溃的!!!
      

  12.   

    如果Holder中包含的个数不一样,可以通过其他布局同样可以解决,不要在一棵树下吊死,毕竟解决问题的方法有多种。