0

我的应用程序似乎在某些使用较旧Android操作系统的设备上没有任何正当理由而崩溃,并且在所有其他设备上运行良好。使用Android的某些设备上的getView(未知源)2.3.4-2.3.6

@Override 
public View getView(int position, View convertView, ViewGroup viewGroup) { 

    LayoutInflater vi; 

    View v = convertView; 

    if (v == null) { 
     vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.general_contact_item_layout, null, false); 
     ViewHolder holder = new ViewHolder(); 

     holder.imageView = (ImageView) v.findViewById(R.id.contactImage); 
     holder.txtName = (TextView) v.findViewById(R.id.contactName); 
     holder.txtName.setTextSize(18); 

     v.setTag(holder); 
    } 
    final Contact contact = contacts.get(position); 

    if (contact != null) { 
     if (contact.contactID != null) 
      v.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contact.contactID)); 
        intent.setData(uri); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intent); 
       } 
      }); 
     ViewHolder holder = (ViewHolder) v.getTag(); 

     if (contact.name != null && contact.name.length() > 0) 
      holder.txtName.setText(contact.name); 
     else 
      holder.txtName.setText("(No Name)"); 
     holder.imageView.setImageURI(null); 
     if (contact.photoUri != null) 
      holder.imageView.setImageURI(contact.photoUri); 

    } 
    return v; 
} 

这里是我的ArrayAdapter堆栈跟踪:

java.lang.NullPointerException 
    at de.android.cc.clean.ui.a.getView(Unknown Source) 
    at android.widget.AbsListView.obtainView(AbsListView.java:1539) 
    at android.widget.ListView.makeAndAddView(ListView.java:1794) 
    at android.widget.ListView.fillDown(ListView.java:719) 
    at android.widget.ListView.fillSpecific(ListView.java:1351) 
    at android.widget.ListView.layoutChildren(ListView.java:1625) 
    at android.widget.AbsListView.onLayout(AbsListView.java:1390) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    at android.view.View.layout(View.java:7228) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    at android.view.View.layout(View.java:7228) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1145) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3687) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.system.NativeStart.main(Native Method) 

的问题是,这个错误似乎有it's源别处。

受影响的设备,例如:

  • ONE TOUCH 4007D
  • GT-I9070
  • GT-S5360
  • GT-I9000

有没有导致任何已知的问题这个问题?

+0

该代码似乎被混淆并且调试信息被删除。但它仍然是你的'getView()'NPE所在的地方。 – laalto

+0

是的,这是混淆 –

回答

1

我无法确认您的问题与getView函数。不过,你只列出了三星设备。在为Android 2.2+开发我的最后一个应用程序时,我遇到了严重问题,访问原始Android资源,如时间/日期选取器对话框布局等。这些问题仅出现在较老的TouchWiz(三星)设备上。这让我相信,三星为了创建TouchWiz,从库存Android中删除了一些文件。尝试回退到其他方法。编辑:你的代码的一个片段可能会有所帮助,找到一个解决方案。

--edit2:我上传了我上一个项目的旧ArrayAdapter。它并没有遵循100%的Androids回收指南,但仍然运行得非常快。这应该引导你如何识别convertView。 download

它应该使用标准组件和标题/附加视图(ea附件按钮),而无需扩展或expandableListView。

+0

是的,你是对的,但我找到了另一个设备,它是一个阿尔卡特ONE TOUCH 4007D。但它是我列表中唯一不是三星 –

+0

我只能猜测。您可以尝试使用并返回convertView而不是新创建的视图。 ViewHolder模式似乎很好。另外我从来没有使用null作为ImageURI的值。就我个人而言,我更喜欢使用超级getView函数,而不是自己膨胀视图。 ' \t \t查看结果; \t \t if(convertView == null){ \t \t \t result = super.getView(position,null,parent); \t \t}否则如果( \t \t \t \t(convertView.getId()== mTextViewResourceId)){ \t \t \t结果= super.getView(位置,convertView,母体); \t \t} else { \t \t \t result = super.getView(position,null,parent); \t \t}' – blender

+0

谢谢,现在就实施它,它工作。现在我将推动更新,只是看看会发生什么,可悲的是我没有其他选择 –

相关问题