0

Я хочу установить пользовательский номер ListView с ArrayAdapter. Каждый ListItem имеет ImageView и два TextViews.Ошибка при настройке пользовательского изображения ListView

Компоновка каждого пункта rowlayout.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<ImageView 
    android:id="@+id/item_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:adjustViewBounds="true" 
    android:maxHeight="80dp" 
    android:maxWidth="80dp" 
    android:src="@drawable/logo" /> 

    <TextView 
    android:id="@+id/item_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/item_subTitle" 
    android:layout_toRightOf="@+id/item_icon" 
    android:text="Titel" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
    android:id="@+id/item_subTitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/item_icon" 
    android:layout_alignLeft="@+id/item_title" 
    android:layout_marginBottom="16dp" 
    android:text="Untertitel" /> 

</RelativeLayout> 

Это, как я установил ListView в моей Нашивки деятельности:

public class Badges extends ActionBarActivity{ 

List<Badge> myBadges = new ArrayList<Badge>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.badges_layout); 

    populateBadgeList(); 
    populateListView(); 

} 

private void populateBadgeList() { 
    myBadges.add(new Badge("Some Text", "Some further Text", R.drawable.badge1)); 
    //and so on 
} 

private void populateListView() { 
    ArrayAdapter<Badge> adapter = new MyListAdapter(); 
    ListView list = (ListView) findViewById(R.id.listView); 
    list.setAdapter(adapter); 
} 

private class MyListAdapter extends ArrayAdapter<Badge> { 
    public MyListAdapter() { 
     super(Badges.this, R.layout.rowlayout, myBadges); 
    } 

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

     View itemView = convertView; 
     if(itemView == null) { 
      itemView = getLayoutInflater().inflate(R.layout.rowlayout, parent, false); 
     } 

     Badge currentBadge = myBadges.get(position); 

     ImageView itemIcon = (ImageView) findViewById(R.id.item_icon); 
     //the error is on the following line: 
     itemIcon.setImageResource(currentBadge.getIconID()); 

     TextView itemTitle = (TextView) findViewById(R.id.item_title); 
     itemTitle.setText(currentBadge.getTitle()); 

     TextView itemSubtitle = (TextView) findViewById(R.id.item_subTitle); 
     itemSubtitle.setText(currentBadge.getSubtitle()); 

     return itemView; 
    } 
} 

Вот класс Знак:

public class Badge { 
String title; 
String subtitle; 
int iconID; 

public Badge(String title, String subtitle, int iconID) { 
    this.title = title; 
    this.subtitle = subtitle; 
    this.iconID = iconID; 
} 

public String getTitle() { 
    return title; 
} 

public String getSubtitle() { 
    return subtitle; 
} 

public int getIconID() { 
    return iconID; 
} 

}

я получаю следующее сообщение об ошибке:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference 

Я пометил строку, в которой произошла ошибка в коде. Что может быть причиной этого?

ответ

1

Вместо использования

ImageView itemIcon = (ImageView) findViewById(R.id.item_icon); 
TextView itemTitle = (TextView) findViewById(R.id.item_title); 
TextView itemSubtitle = (TextView) findViewById(R.id.item_subTitle); 

Использование

ImageView itemIcon = (ImageView) itemView.findViewById(R.id.item_icon); 
TextView itemTitle = (TextView) itemView.findViewById(R.id.item_title); 
TextView itemSubtitle = (TextView)itemView.findViewById(R.id.item_subTitle); 
1

Заменить

ImageView itemIcon = (ImageView) findViewById(R.id.item_icon); 

это с

ImageView itemIcon = (ImageView) itemView.findViewById(R.id.item_icon); 

и аналогично

TextView itemTitle = (TextView) itemView.findViewById(R.id.item_title); 
TextView itemSubtitle = (TextView) itemView.findViewById(R.id.item_subTitle); 

с

TextView itemTitle = (TextView) findViewById(R.id.item_title); 
TextView itemSubtitle = (TextView) findViewById(R.id.item_subTitle); 
0

мнение, вы просто надуть не добавить в макет вашей деятельности в. Таким образом, с использованием метода деятельности

ImageView itemIcon = (ImageView) findViewById(R.id.item_icon); 
itemIcon.setImageResource(currentBadge.getIconID()); 

У вас не получилось найти мнение по этому объекту. Вместо этого вы должны использовать

ImageView itemIcon = (ImageView) itemView.findViewById(R.id.item_icon); 
itemIcon.setImageResource(currentBadge.getIconID()); 

Он будет работать должным образом. Другие взгляды похожи.

0

Я думаю, ваша проблема в этой строке: ArrayAdapter adapter = new MyListAdapter();

Изменить на это: MyListAdapter adapter = new MyListAdapter();

Кроме того, положить вид вещь перед методами findViewById (ImageView itemIcon = (ImageView) itemview.findViewById (R.id.item_icon);)

Я бы на самом деле рекомендую обобщая свой класс адаптера, так что вы могли бы передать любой ресурс (макет строки) и перечислить его :) (Тем не менее, приложение не должно работать.)

Так что-то вроде этого:

private class MyListAdapter extends ArrayAdapter<Badge> { 

    int resource; 
    public MyListAdapter(Context context, int resource, List<Badge> items) { 
     super(context, resource, items); 
     this.resource = resource; 
    } 

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

    View itemView = convertView; 
    if(itemView == null) { 
     itemView = getLayoutInflater().inflate(resource, parent, false); 
    } 

    Badge currentBadge = getItem(position); 

    ImageView itemIcon = (ImageView) itemview.findViewById(R.id.item_icon); 
    //the error is on the following line: 
    itemIcon.setImageResource(currentBadge.getIconID()); 

    TextView itemTitle = (TextView) itemview.findViewById(R.id.item_title); 
    itemTitle.setText(currentBadge.getTitle()); 

    TextView itemSubtitle = (TextView) itemview.findViewById(R.id.item_subTitle); 
    itemSubtitle.setText(currentBadge.getSubtitle()); 

    return itemView; 
    } 
} 
Смежные вопросы