一个适配器中有多个视图(inflaters)

时间:2015-04-04 16:40:18

标签: java android adapter

如何在一个适配器中使用两个不同的视图?我需要一个布局中的3个字段和其他布局中的第4个字段。

如果屏幕上只有1-5项(扩展基本适配器),则此代码可以正常工作:

@Override
public View getView (final int position, View convertView, ViewGroup parent) {
FieldsAndText p = getFields(position);

view = convertView;
    if (position != 3) {
      if (view == null) {
        view = lInflater.inflate(R.layout.addproduct_item, parent, false);
      }
    ((TextView) view.findViewById(R.id.addProductTextView)).setText(p.name);
    EditText editText = (EditText) view.findViewById(R.id.addProductEditText);
    editText.setText(p.value);
    }
    else if (position == 3) {
      if (view == null) {
        view = lInflater.inflate(R.layout.alternative_item, parent, false);
        TextView textView = (TextView) view.findViewById(R.id.alternative_textView1);
      }
    }
    return view;
}

但是当有超过5个项目并且向下滚动时,我有一个错误:

  

空指针异常:((TextView)view.findViewById(R.id.addProductTextView))。setText(p.name);

1 个答案:

答案 0 :(得分:0)

您需要实施getViewTypeCount()getItemViewType()来教授AdapterView多种类型的行。

例如,以下是一个ListAdapter的活动,其中包含标题和详细信息的单独布局:

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
 */

package com.commonsware.android.headerdetail;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class HeaderDetailListDemo extends ListActivity {
  private static final String[][] items= {
      { "lorem", "ipsum", "dolor", "sit", "amet" },
      { "consectetuer", "adipiscing", "elit", "morbi", "vel" },
      { "ligula", "vitae", "arcu", "aliquet", "mollis" },
      { "etiam", "vel", "erat", "placerat", "ante" },
      { "porttitor", "sodales", "pellentesque", "augue", "purus" } };

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setListAdapter(new IconicAdapter());
  }

  class IconicAdapter extends BaseAdapter {
    @Override
    public int getCount() {
      int count=0;

      for (String[] batch : items) {
        count+=1 + batch.length;
      }

      return(count);
    }

    @Override
    public Object getItem(int position) {
      int offset=position;
      int batchIndex=0;

      for (String[] batch : items) {
        if (offset == 0) {
          return(Integer.valueOf(batchIndex));
        }

        offset--;

        if (offset < batch.length) {
          return(batch[offset]);
        }

        offset-=batch.length;
        batchIndex++;
      }

      throw new IllegalArgumentException("Invalid position: "
          + String.valueOf(position));
    }

    @Override
    public long getItemId(int position) {
      return(position);
    }

    @Override
    public int getViewTypeCount() {
      return(2);
    }

    @Override
    public int getItemViewType(int position) {
      if (getItem(position) instanceof Integer) {
        return(0);
      }

      return(1);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      if (getItemViewType(position) == 0) {
        return(getHeaderView(position, convertView, parent));
      }

      View row=convertView;

      if (row == null) {
        row=getLayoutInflater().inflate(R.layout.row, parent, false);
      }

      ViewHolder holder=(ViewHolder)row.getTag();

      if (holder == null) {
        holder=new ViewHolder(row);
        row.setTag(holder);
      }

      String word=(String)getItem(position);

      if (word.length() > 4) {
        holder.icon.setImageResource(R.drawable.delete);
      }
      else {
        holder.icon.setImageResource(R.drawable.ok);
      }

      holder.label.setText(word);
      holder.size.setText(String.format(getString(R.string.size_template),
                                        word.length()));

      return(row);
    }

    private View getHeaderView(int position, View convertView,
                               ViewGroup parent) {
      View row=convertView;

      if (row == null) {
        row=getLayoutInflater().inflate(R.layout.header, parent, false);
      }

      Integer batchIndex=(Integer)getItem(position);
      TextView label=(TextView)row.findViewById(R.id.label);

      label.setText(String.format(getString(R.string.batch),
                                  1 + batchIndex.intValue()));

      return(row);
    }
  }
}

getViewTypeCount()返回2,因为我有两种类型的行。 getItemViewType()根据0方法的结果返回1表示标题行,getItem()表示详细信息行,Integer方法的结果为String作为标题和来自我的数组数组的{{1}}作为详细信息行的模型数据。