安卓:EfficientAdapter有两种不同的意见 [英] Android: EfficientAdapter with two different Views

查看:88
本文介绍了安卓:EfficientAdapter有两种不同的意见的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用BaseAdapter的基础上,<一个扩展版href="http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.html">EfficientAdapter例如的SDK中演示的样品。

我的数据基本上是一个对象(<$ C C $> ListPlaces ),它持有的ArrayList 与地方的实际列表,访问通过 listPlaces.getValues​​()。该ArrayList中的数据是由范围和的ArrayList 包括一些特殊项目(分隔符),没有数据,但分隔符标记设置为

现在,每当我 EfficientAdapter 得到一个数据对象,它是它返回一个分隔符公共布尔的IsEnabled(INT位置)公开查看getView(INT位置,查看convertView,ViewGroup中父)充气两种不同的布局取决于该目前的数据对象包括实时数据,或只是一个分隔符假。

这个伟大的工程,如果我每一次膨胀的布局。然而,每一次膨胀的布局和调用 findViewById 使的ListView 几乎unusabely慢。

于是,我就用与 ViewHolder 办法EfficientAdapter。但是,这并没有正确的开箱工作,两个不同的看法,因为我尝试访问。所以每当我 convertView!= NULL (在其他情况下)访问,通过对布局的项目我们的 ViewHolder 当在previous看法是分隔它当然不工作访问一个TextView有这仅适用于真实的项目布局。

所以,我也逼我的 getView()膨胀的布局,不仅在 convertView == NULL ,但还当previous listRow比当前的不同:如果(!convertView == NULL ||(listRow = listRow_ previous)){[...]}

这似乎现在几乎工作。或者至少它不会从一开始就崩溃。但它仍然崩溃,我不知道我已经做不同。我试图寻找到 convertView.getID() convertView.getResources(),但这不是真正的帮助至今。也许别人有一个想法如何,我可以检查我的电流 convertView 是否与列表项布局或列表分隔布局相匹配。谢谢你。

这里的code。凡曾经有一个[...]我拿出一些不太重要的code,使其更容易阅读和理解:

 私有类EfficientAdapter扩展了BaseAdapter {
  私人LayoutInflater mInflater;
  私人ListPlaces listPlaces;

  私人ListRow listRow;
  私人ListRow listRow_ previous;


  公共EfficientAdapter(上下文的背景下,ListPlaces listPlaces){
      //缓存的LayoutInflate避免询问,每次一个新的。
      mInflater = LayoutInflater.from(上下文);

      // 数据
      this.listPlaces = listPlaces;
  }

  / **
    *的项目列表中的数量由物品的数量来确定
    *在我们的ArrayList
    *
    * @see android.widget.ListAdapter#getCount将()
    * /
  公众诠释getCount将(){
      返回listPlaces.getValues​​()的大小()。
  }

  / **
    *由于数据来自一个阵列,只返回该指数是
    * sufficent来获得数据。如果我们使用一个更复杂的数据
    *结构,我们会回来再presents在一排任何对象
    *名单。
    *
    * @see android.widget.ListAdapter#的getItem(INT)
    * /
  公共对象的getItem(INT位置){
      返回的位置;
  }

  / **
    *使用数组索引作为一个唯一的ID。
    *
    * @see android.widget.ListAdapter#getItemId(INT)
    * /
  众长getItemId(INT位置){
      返回的位置;
  }

  @覆盖
  公共布尔的IsEnabled(INT位置){
      //返回false,如果项目是一个分隔符:
      如果(listPlaces.getValues​​()得到(位置).separator&GT; = 0)
    返回false;
      其他
    返回true;
  }

  @覆盖
  公共布尔areAllItemsEnabled(){
      返回false;
  }



  / **
    *做一个以持有的每一行。
    *
    * @see android.widget.ListAdapter#getView(INT,android.view.View,
    * android.view.ViewGroup)
    * /
  公共查看getView(INT位置,查看convertView,ViewGroup中父){

      //获取值当前列表元素
      。ListPlacesValues​​ curValues​​ = listPlaces.getValues​​()得到(位置);
      如果(curValues​​.separator&GT; = 0)
    listRow = ListRow.SEPARATOR;
      其他
    listRow = ListRow.ITEM;
      Log.i(TAG,适配器:getView(+位置+)+ listRow +(+ listRow_ previous +) - &GT; START);

      //一个ViewHolder不断提及孩子的意见,以避免不必要的来电
      //到每一行上findViewById()。
      ViewHolder持有人;

      //当convertView不为空,我们可以直接重复使用它,也没有必要
      //为reinflate它。我们只吹一个新的视图时,convertView提供
      //通过的ListView为空。
      如果(convertView == NULL ||(listRow!= listRow_ previous)){
    Log.i(TAG, - &GT;(convertView == NULL)在位置:+位置);
    //创建一个ViewHolder和存储引用的两个孩子意见
    //我们希望将数据绑定到。
    持有人=新ViewHolder();

    如果(listRow == ListRow.SEPARATOR){
    convertView = mInflater.inflate(R.layout.taxonomy_list_separator,NULL);
    holder.separatorText =(TextView中)convertView.findViewById(R.id.separatorText);
    convertView.setTag(保持器);
    Log.i(TAG,\ t创建分隔符:convertView ID:+ convertView.getId()+资源+ convertView.getResources());

    }
    	  其他 {

    convertView = mInflater.inflate(R.layout.taxonomy_listitem,NULL);
    holder.name =(TextView中)convertView.findViewById(R.id.name);
    holder.category =(TextView中)convertView.findViewById(R.id.category);
    // [...]

    convertView.setTag(保持器);

    Log.i(TAG,\ t创建项目:convertView ID:+ convertView.getId()+资源+ convertView.getResources());
    }
      } 其他 {
    //获取ViewHolder回得到快速访问的TextView
    //和ImageView的。
    Log.i(TAG,\ tconvertView编号:+ convertView.getId()+资源:+ convertView.getResources());

    支架=(ViewHolder)convertView.getTag();
    convertView.setAnimation(空);
      }

      / *有效地与支架*绑定数据/
      如果(listRow == ListRow.SEPARATOR){
    字符串separatorText;
    开关(curValues​​.separator){
    情况下0:separatorText =0的情况下;打破;
    案例1:separatorText =案例1;打破;
    案例2:separatorText =案2;打破;
    // [...]
    默认:separatorText =[错误];打破;
    }
    holder.separatorText.setText(separatorText);
      }
      其他 {
    //设置名称:
    holder.name.setText(curValues​​.name);
    //设置类别
    串猫= curValues​​.classification.toString();
    猫= cat.substring(1,cat.length() -  1); //删除[和]
    如果(cat.length()→35){
    猫= cat.substring(0,35);
    猫=猫+...;
    }
    holder.category.setText(猫);

    // [...](还有更多TextViews和ImageViews进行设置)

      }

      listRow_ previous = listRow;
      Log.i(TAG,适配器:getView(+位置+) - &GT; DONE);
      返回convertView;
  }

  私有类ViewHolder {
      TextView的名称;
      TextView的类;
      // [...]  - &GT;更多TextViews和ImageViews

      TextView的separatorText;
  }
}
 

在这里,我的的logcat 输出:

  755 ListPlaces_Activity我onPostExecute:notifyDataSetChanged()
  755 ListPlaces_Activity我适配器:getView(0)分离器(空) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:0
  755 ListPlaces_Activity创建分隔符:convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(0) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(1)物品(分割) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:1
  755 ListPlaces_Activity创建项目:convertView编号:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(1) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(2)分离器(ITEM) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:2
  755 ListPlaces_Activity创建分隔符:convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(2) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(3)项目(分离器) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:3
  755 ListPlaces_Activity创建项目:convertView编号:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(3) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(4)项(项) - &GT;开始
  755 ListPlaces_Activity我convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(4) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(5)项(项) - &GT;开始
  755 ListPlaces_Activity我convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(5) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(6)项(项) - &GT;开始
  755 ListPlaces_Activity我convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(6) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(0)分离器(ITEM) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:0
  755 ListPlaces_Activity创建分隔符:convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(0) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(1)物品(分割) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:1
  755 ListPlaces_Activity创建项目:convertView编号:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(1) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(2)分离器(ITEM) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:2
  755 ListPlaces_Activity创建分隔符:convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(2) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(3)项目(分离器) - &GT;开始
  755 ListPlaces_Activity我 - &GT; (convertView == NULL)在位置:3
  755 ListPlaces_Activity创建项目:convertView编号:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(3) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(4)项(项) - &GT;开始
  755 ListPlaces_Activity我convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 ListPlaces_Activity我适配器:getView(4) - &GT; DONE
  755 ListPlaces_Activity我适配器:getView(5)项(项) - &GT;开始
  755 ListPlaces_Activity我convertView ID:2131296317资源:android.content.res.Resources@437613e0
  755 AndroidRuntimeð关闭VM
  755 dalvikvmW¯¯主题ID = 3:线程退出与未捕获的异常(组= 0x4001aa28)
  755 AndroidRuntimeË未捕获的处理程序:螺纹主力退出,由于未捕获的异常
  755 AndroidRuntimeË显示java.lang.NullPointerException
  755 AndroidRuntime辰礼com.tato.main.ListPlaces_Activity $ EfficientAdapter.getView(ListPlaces_Activity.java:330​​)
  755 AndroidRuntime辰礼android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:191)
  755 AndroidRuntime辰礼android.widget.AbsListView.obtainView(AbsListView.java:1255)
  755 AndroidRuntime辰礼android.widget.ListView.makeAndAddView(ListView.java:1658)
  755 AndroidRuntime辰礼android.widget.ListView.fillDown(ListView.java:637)
  755 AndroidRuntime辰礼android.widget.ListView.fillFromTop(ListView.java:694)
  755 AndroidRuntime辰礼android.widget.ListView.layoutChildren(ListView.java:1502)
  755 AndroidRuntime辰礼android.widget.AbsListView.onLayout(AbsListView.java:1112)
  755 AndroidRuntime辰礼android.view.View.layout(View.java:6569)
  755 AndroidRuntime辰礼android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
  755 AndroidRuntime辰礼android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
  755 AndroidRuntime辰礼android.widget.LinearLayout.onLayout(LinearLayout.java:918)
  755 AndroidRuntime辰礼android.view.View.layout(View.java:6569)
  755 AndroidRuntime辰礼android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  755 AndroidRuntime辰礼android.view.View.layout(View.java:6569)
  755 AndroidRuntime辰礼android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
  755 AndroidRuntime辰礼android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
  755 AndroidRuntime辰礼android.widget.LinearLayout.onLayout(LinearLayout.java:918)
  755 AndroidRuntime辰礼android.view.View.layout(View.java:6569)
  755 AndroidRuntime辰礼android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  755 AndroidRuntime辰礼android.view.View.layout(View.java:6569)
  755 AndroidRuntime辰礼android.view.ViewRoot.performTraversals(ViewRoot.java:979)
  755 AndroidRuntime辰礼android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
  755 AndroidRuntime辰礼android.os.Handler.dispatchMessage(Handler.java:99)
  755 AndroidRuntime辰礼android.os.Looper.loop(Looper.java:123)
  755 AndroidRuntime辰礼android.app.ActivityThread.main(ActivityThread.java:4203)
  755 AndroidRuntime辰礼java.lang.reflect.Method.invokeNative(本机方法)
  755 AndroidRuntime辰礼java.lang.reflect.Method.invoke(Method.java:521)
  755 AndroidRuntime辰礼com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:791)
  755 AndroidRuntime辰礼com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
  755 AndroidRuntime辰礼dalvik.system.NativeStart.main(本机方法)
 

解决方案

您忘了几个方法,你需要重写:<一href="http://developer.android.com/reference/android/widget/Adapter.html#getViewTypeCount%28%29">getViewTypeCount()和<一href="http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType%28int%29">getItemViewType().这些不需要的列表,其中所有的行是相同的,但它们是您的方案很重要。正确实现这些,而Android将维持独立的对象池为您的标题和明细行。

或者,你可以看看:

  • 杰夫·夏基原来的<一个href="http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/">SeparatedListAdapter (GPL)
  • 在我的更新再现(GPL)
  • MergeAdapter 时,它可以被用于这种情况下,以及(阿帕奇)

I'm using an extended version of BaseAdapter based on the EfficientAdapter example from the SDK demo samples.

My data is basically an object (ListPlaces) which holds an ArrayList with the actual list of places, accessible via listPlaces.getValues(). This ArrayList data is sorted by range and the ArrayList consist of some special items (separators), with no data, but a separator flag set to true.

Now whenever my EfficientAdapter gets a data object which is a separator it returns false for public boolean isEnabled(int position) and public View getView(int position, View convertView, ViewGroup parent) inflates two different layouts depending on if the current data object consists of real data or is just a separator dummy.

This works great, if I inflate the layout every time. However, inflating the layout every time and calling findViewById makes the ListView almost unusabely slow.

So I tried to use the EfficientAdapter with ViewHolder approach. But that didn't work right out of the box, because of the two different views I try to access. So whenever my convertView != null (the else-case) accesses the items on the layout via our ViewHolder and when the previous View was a separator it of course doesn't work to access a TextView there which is only available on the "real" items layout.

So I also force my getView() to inflate the layout not only when convertView == null, but also when the previous listRow is different than the current one: if (convertView == null || (listRow != listRow_previous)) { [....] }

This seems to almost work now. Or at least it doesn't crash right from the beginning. But it still crashes and I don't know what I've to do different. I've tried to look into convertView.getID() and convertView.getResources(), but that wasn't really helpful so far. Maybe someone else has an idea how I can check whether my current convertView matches with the list item layout or the list separator layout. Thanks.

Here's the code. Where ever there is a [...] I took out some less important code to make it easier to read and understand:

private class EfficientAdapter extends BaseAdapter {
  private LayoutInflater mInflater;
  private ListPlaces listPlaces;

  private ListRow listRow;
  private ListRow listRow_previous;


  public EfficientAdapter(Context context, ListPlaces listPlaces) {
      // Cache the LayoutInflate to avoid asking for a new one each time.
      mInflater = LayoutInflater.from(context);

      // Data
      this.listPlaces = listPlaces;
  }

  /**
    * The number of items in the list is determined by the number of items
    * in our ArrayList
    *
    * @see android.widget.ListAdapter#getCount()
    */
  public int getCount() {
      return listPlaces.getValues().size();
  }

  /**
    * Since the data comes from an array, just returning the index is
    * sufficent to get at the data. If we were using a more complex data
    * structure, we would return whatever object represents one row in the
    * list.
    *
    * @see android.widget.ListAdapter#getItem(int)
    */
  public Object getItem(int position) {
      return position;
  }

  /**
    * Use the array index as a unique id.
    *
    * @see android.widget.ListAdapter#getItemId(int)
    */
  public long getItemId(int position) {
      return position;
  }

  @Override
  public  boolean isEnabled(int position) {
      // return false if item is a separator:
      if(listPlaces.getValues().get(position).separator >= 0)
    	  return false;
      else
    	  return true;
  }

  @Override
  public boolean  areAllItemsEnabled() {
      return false;			
  }



  /**
    * Make a view to hold each row.
    *
    * @see android.widget.ListAdapter#getView(int, android.view.View,
    *      android.view.ViewGroup)
    */
  public View getView(int position, View convertView, ViewGroup parent) {

      // Get the values for the current list element
      ListPlacesValues curValues = listPlaces.getValues().get(position);
      if (curValues.separator >= 0) 
    	  listRow = ListRow.SEPARATOR;
      else
    	  listRow = ListRow.ITEM;
      Log.i(TAG,"Adapter: getView("+position+") " + listRow + " (" + listRow_previous + ") -> START");

      // A ViewHolder keeps references to children views to avoid unneccessary calls
      // to findViewById() on each row.
      ViewHolder holder;

      // When convertView is not null, we can reuse it directly, there is no need
      // to reinflate it. We only inflate a new View when the convertView supplied
      // by ListView is null.
      if (convertView == null || (listRow != listRow_previous)) {
    	  Log.i(TAG, "--> (convertView == null) at position: " + position);
    	  // Creates a ViewHolder and store references to the two children views
    	  // we want to bind data to.
    	  holder = new ViewHolder();

    	  if (listRow == ListRow.SEPARATOR) {
    		  convertView = mInflater.inflate(R.layout.taxonomy_list_separator, null);
    		  holder.separatorText = (TextView) convertView.findViewById(R.id.separatorText);
    		  convertView.setTag(holder);
    		  Log.i(TAG,"\tCREATE SEPARATOR: convertView ID: " + convertView.getId() + " Resource: " + convertView.getResources());

    	  }
    	  else {

    		  convertView = mInflater.inflate(R.layout.taxonomy_listitem, null);
    		  holder.name = (TextView) convertView.findViewById(R.id.name);
    		  holder.category = (TextView) convertView.findViewById(R.id.category);
    		  // [...]

    		  convertView.setTag(holder);

    		  Log.i(TAG,"\tCREATE ITEM: convertView ID: " + convertView.getId() + " Resource: " + convertView.getResources());
    	  }
      } else {
    	  // Get the ViewHolder back to get fast access to the TextView
    	  // and the ImageView.
    	  Log.i(TAG,"\tconvertView ID: " + convertView.getId() + " Resource: " + convertView.getResources());

    	  holder = (ViewHolder) convertView.getTag();
    	  convertView.setAnimation(null);
      }

      /* Bind the data efficiently with the holder */
      if (listRow == ListRow.SEPARATOR) {
    	  String separatorText;
    	  switch (curValues.separator) {
    	  case 0: separatorText="case 0"; break;
    	  case 1: separatorText="case 1"; break;
    	  case 2: separatorText="case 2"; break;
    	  // [...]
    	default: separatorText="[ERROR]"; break;
    	  }
    	  holder.separatorText.setText(separatorText);
      } 
      else {
    	  // Set the name:
    	  holder.name.setText(curValues.name);
    	  // Set category
    	  String cat = curValues.classification.toString();
    	  cat = cat.substring(1,cat.length()-1);	// removing "[" and "]"
    	  if (cat.length() > 35) {
    		  cat = cat.substring(0, 35);
    		  cat = cat + "...";
    	  }
    	  holder.category.setText(cat);

    	  // [...] (and many more TextViews and ImageViews to be set)

      }

      listRow_previous = listRow;
      Log.i(TAG,"Adapter: getView("+position+") -> DONE");
      return convertView;
  }

  private class ViewHolder {
      TextView name;
      TextView category;
      // [...] -> many more TextViews and ImageViews

      TextView separatorText;
  }
}

And here my Logcat output:

  755     ListPlaces_Activity  I  onPostExecute: notifyDataSetChanged()                                                                                                
  755     ListPlaces_Activity  I  Adapter: getView(0) SEPARATOR (null) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 0                                                                                             
  755     ListPlaces_Activity  I        CREATE SEPARATOR: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                  
  755     ListPlaces_Activity  I  Adapter: getView(0) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(1) ITEM (SEPARATOR) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 1                                                                                             
  755     ListPlaces_Activity  I        CREATE ITEM: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                       
  755     ListPlaces_Activity  I  Adapter: getView(1) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(2) SEPARATOR (ITEM) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 2                                                                                             
  755     ListPlaces_Activity  I        CREATE SEPARATOR: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                  
  755     ListPlaces_Activity  I  Adapter: getView(2) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(3) ITEM (SEPARATOR) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 3                                                                                             
  755     ListPlaces_Activity  I        CREATE ITEM: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                       
  755     ListPlaces_Activity  I  Adapter: getView(3) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(4) ITEM (ITEM) -> START                                                                                             
  755     ListPlaces_Activity  I        convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                                    
  755     ListPlaces_Activity  I  Adapter: getView(4) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(5) ITEM (ITEM) -> START                                                                                             
  755     ListPlaces_Activity  I        convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                                    
  755     ListPlaces_Activity  I  Adapter: getView(5) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(6) ITEM (ITEM) -> START                                                                                             
  755     ListPlaces_Activity  I        convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                                    
  755     ListPlaces_Activity  I  Adapter: getView(6) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(0) SEPARATOR (ITEM) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 0                                                                                             
  755     ListPlaces_Activity  I        CREATE SEPARATOR: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                  
  755     ListPlaces_Activity  I  Adapter: getView(0) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(1) ITEM (SEPARATOR) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 1                                                                                             
  755     ListPlaces_Activity  I        CREATE ITEM: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                       
  755     ListPlaces_Activity  I  Adapter: getView(1) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(2) SEPARATOR (ITEM) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 2                                                                                             
  755     ListPlaces_Activity  I        CREATE SEPARATOR: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                  
  755     ListPlaces_Activity  I  Adapter: getView(2) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(3) ITEM (SEPARATOR) -> START                                                                                        
  755     ListPlaces_Activity  I  --> (convertView == null) at position: 3                                                                                             
  755     ListPlaces_Activity  I        CREATE ITEM: convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                       
  755     ListPlaces_Activity  I  Adapter: getView(3) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(4) ITEM (ITEM) -> START                                                                                             
  755     ListPlaces_Activity  I        convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                                    
  755     ListPlaces_Activity  I  Adapter: getView(4) -> DONE                                                                                                          
  755     ListPlaces_Activity  I  Adapter: getView(5) ITEM (ITEM) -> START                                                                                             
  755     ListPlaces_Activity  I        convertView ID: 2131296317 Resource: android.content.res.Resources@437613e0                                                    
  755          AndroidRuntime  D  Shutting down VM                                                                                                                     
  755                dalvikvm  W  threadid=3: thread exiting with uncaught exception (group=0x4001aa28)                                                                
  755          AndroidRuntime  E  Uncaught handler: thread main exiting due to uncaught exception                                                                      
  755          AndroidRuntime  E  java.lang.NullPointerException                                                                                                       
  755          AndroidRuntime  E        at com.tato.main.ListPlaces_Activity$EfficientAdapter.getView(ListPlaces_Activity.java:330)                                    
  755          AndroidRuntime  E        at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:191)                                                
  755          AndroidRuntime  E        at android.widget.AbsListView.obtainView(AbsListView.java:1255)                                                                
  755          AndroidRuntime  E        at android.widget.ListView.makeAndAddView(ListView.java:1658)                                                                  
  755          AndroidRuntime  E        at android.widget.ListView.fillDown(ListView.java:637)                                                                         
  755          AndroidRuntime  E        at android.widget.ListView.fillFromTop(ListView.java:694)                                                                      
  755          AndroidRuntime  E        at android.widget.ListView.layoutChildren(ListView.java:1502)                                                                  
  755          AndroidRuntime  E        at android.widget.AbsListView.onLayout(AbsListView.java:1112)                                                                  
  755          AndroidRuntime  E        at android.view.View.layout(View.java:6569)                                                                                    
  755          AndroidRuntime  E        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)                                                           
  755          AndroidRuntime  E        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)                                                           
  755          AndroidRuntime  E        at android.widget.LinearLayout.onLayout(LinearLayout.java:918)                                                                 
  755          AndroidRuntime  E        at android.view.View.layout(View.java:6569)                                                                                    
  755          AndroidRuntime  E        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)                                                                   
  755          AndroidRuntime  E        at android.view.View.layout(View.java:6569)                                                                                    
  755          AndroidRuntime  E        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)                                                           
  755          AndroidRuntime  E        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)                                                           
  755          AndroidRuntime  E        at android.widget.LinearLayout.onLayout(LinearLayout.java:918)                                                                 
  755          AndroidRuntime  E        at android.view.View.layout(View.java:6569)                                                                                    
  755          AndroidRuntime  E        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)                                                                   
  755          AndroidRuntime  E        at android.view.View.layout(View.java:6569)                                                                                    
  755          AndroidRuntime  E        at android.view.ViewRoot.performTraversals(ViewRoot.java:979)                                                                  
  755          AndroidRuntime  E        at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)                                                                     
  755          AndroidRuntime  E        at android.os.Handler.dispatchMessage(Handler.java:99)                                                                         
  755          AndroidRuntime  E        at android.os.Looper.loop(Looper.java:123)                                                                                     
  755          AndroidRuntime  E        at android.app.ActivityThread.main(ActivityThread.java:4203)                                                                   
  755          AndroidRuntime  E        at java.lang.reflect.Method.invokeNative(Native Method)                                                                        
  755          AndroidRuntime  E        at java.lang.reflect.Method.invoke(Method.java:521)                                                                            
  755          AndroidRuntime  E        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)                                             
  755          AndroidRuntime  E        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)                                                                
  755          AndroidRuntime  E        at dalvik.system.NativeStart.main(Native Method)

解决方案

You forgot a couple of methods you need to override: getViewTypeCount() and getItemViewType(). These are not needed for lists where all rows are the same, but they are very important for your scenario. Implement these properly, and Android will maintain separate object pools for your headers and detail rows.

Or, you could look at:

这篇关于安卓:EfficientAdapter有两种不同的意见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆