0

Мое приложение, похоже, случайно не работает на некоторых устройствах со старыми ОС Android и отлично работает со всеми остальными.getView (Неизвестный источник) на некоторых устройствах с Android 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; 
} 

Вот StackTrace из моего 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) 

Проблема заключается в том, что эта ошибка, кажется, есть источник подмигнули где-то в другом месте.

Затронутые устройства, например:

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

Есть ли какой-либо известная проблема, которая вызывает Эта проблема?

+0

Код кажется запутанным, и отладочная информация удаляется. Но это все еще ваш 'getView()', где находится NPE. – laalto

+0

Да, он запутан –

ответ

1

Я не могу подтвердить вашу проблему с помощью функции getView. Однако вы указали только устройства samsung. При разработке моего последнего приложения для Android 2.2+ я столкнулся с серьезными проблемами, обращаясь к оригинальным ресурсам Android, таким как макеты диалогов времени и даты и т. Д. Эти проблемы появились только на более старых устройствах TouchWiz (Samsung). Это заставляет меня поверить, что Samsung удалил пару файлов с Android Android, чтобы создать TouchWiz. Попытайтесь отступить, к другим методам. --edit: фрагмент кода может помочь найти решение.

--edit2: Я загрузил старый ArrayAdapter моего последнего проекта. Он не соответствует правилам утилизации андроидов на 100%, но все еще работает довольно быстро. Это должно указывать на то, как идентифицировать convertView. download

Предполагается использовать стандартные компоненты и заголовки/дополнительные виды (аксессуарные кнопки) без необходимости расширения или расширенияListView.

+0

Да, вы правы, но я нашел другое устройство, это Alcatel ONE TOUCH 4007D. Но это единственный не Samsung в моем списке –

+0

Я могу только догадываться. Вы можете попробовать, использовать и возвращать convertView вместо вашего вновь созданного представления. Образец ViewHolder кажется прекрасным. Также я никогда не использовал значение null как значение для ImageURI. Лично мне нравится использовать функцию supView 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

Спасибо, внедрил его сейчас, и он работает.Теперь я подтолкнул обновление и посмотрю, что произойдет, к сожалению, у меня нет другого выбора. –