2013-12-03 3 views
3

Я пытаюсь заполнить пользовательский элемент управления ListView с этим LazyAdapter класса из этого tutorialAndroid элементы пользовательских ListView (findViewById возвращает нуль)

Я хочу, чтобы просмотреть список элементов с нестандартной конструкцией. Файл макета list_row.xml находится в моем файле макетов, как в учебнике. Это немного измененная функция GetView в LazyAdapter классе:

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    if(convertView==null) 
     //vi = inflater.inflate(R.layout.list_row, null); //EDITED 
     vi = inflater.inflate(R.layout.list_row, parent, false); 
    TextView title = (TextView)vi.findViewById(R.id.title); // title 
    TextView subtitle = (TextView)vi.findViewById(R.id.subtitle); // artist name 
    //ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); 

    //This is not needed 
    //HashMap<String, String> post = new HashMap<String, String>(); 
    HashMap<String, String> post; 
    post = data.get(position); 
    // Setting all values in listview 
    title.setText(post.get("title"));  //the code crashes here 
    subtitle.setText(post.get("subtitle")); 
    //imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image); 
    return vi; 
} 

Ну этот код аварии на title.setText(), потому что название является недействительным. Я где-то читал, что это имеет смысл, потому что этот LazyAdapter вызывает findViewById до setContentView или что-то в этом роде.

Итак, как мне это сделать? И как этот код работает для этого парня?

Update

Это list_row.xml файл:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_selector" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <!-- Title --> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#040404" 
     android:typeface="sans" 
     android:textSize="14sp" 
     android:textStyle="bold"/> 

    <!-- Subtitle --> 
    <TextView 
     android:id="@+id/subtitle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/subtitle" 
     android:textColor="#343434" 
     android:textSize="10sp" 
     android:layout_marginTop="1dip" /> 

</RelativeLayout> 

Для экономии места я только добавление ListView XML из основного файла макета деятельности: Код

<ListView 
    android:id="@+id/feedListView" 
    android:layout_marginTop="20dp" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/volumeControl1"> 
</ListView> 

адаптер : http://pastebin.com/niC1yXiJ

И трассировка стека: http://pastebin.com/myW8B0Xz

+0

setContentView используется в действии и не используется в этом случае. Если надуватель действительно раздувает макет с идентификаторами, на которые вы ссылаетесь, не должно быть нулевого указателя. Не могли бы вы разместить xml, который будет вместе с этим? Кроме того, вы должны называть inflater.inflate (R.layout.list_row, parent, false); Это позволяет раздутому макету использовать макет родителя, но ложь не позволяет ему привязываться. Вы также можете опубликовать журнал ошибок – Spidy

+1

Что такое данные ниже строки кода hashmap? Если вы получаете нулевое значение в заголовке, в заголовке сообщения hashmap отсутствует значение по ключу. –

+0

Данные HashMap заполняются .. это работает нормально .. – user568021

ответ

1

Это была адская поездка (две бессонные ночи). Спасибо за вашу помощь, как-то я ее исправил! :)

В основном благодаря этому вопросу Null pointer exception in getView() of custom Adapter я сделал новую функцию GetView:

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 
    View vi = convertView; 
    if (vi == null) { 
     LayoutInflater inflater = ((Activity)activity).getLayoutInflater(); 
     vi = inflater.inflate(R.layout.list_row, null); 
     holder.title = (TextView) vi.findViewById(R.id.title); 
     holder.subtitle = (TextView) vi.findViewById(R.id.subtitle); 
     vi.setTag(holder); 
    } else { 

     holder = (ViewHolder) vi.getTag(); 
    } 
    HashMap<String, String> post; 
    post = data.get(position); 
    holder.title.setText(post.get("title")); 
    holder.subtitle.setText(post.get("subtitle")); 
    return vi; 
} 

держатель является лишь простой класс:

private class ViewHolder { 
    public TextView title; 
    public TextView subtitle; 
} 

Я сделал это, и я скопировал XML вытяжке файлы во всех доступных папках (объединить все). Итак, одно из этих действий зафиксировало это, но я не совсем уверен, что ..

1

Попробуйте передать родителя, когда вы надуваете свою камеру. С помощью этого method:

общественного мнения надуть (INT ресурс, ViewGroup корень, логическое attachToRoot)

vi = inflater.inflate(R.layout.list_row, parent, false); 
+0

да. это именно то, что у меня есть сейчас, но не решает проблему. Я отредактирую код в вопросе ... – user568021

+0

Можете ли вы просто для тестирования удалить хэш-карту и хард-код в значениях, чтобы я мог быть уверен в том, что на самом деле null в этой ситуации, например: title.setText ("test"); – sgarman

+0

ОК .. 15 минут .. У меня есть проблема с моим эмулятором сейчас. – user568021

0

Если вы получаете android.widget.AbsListView.obtainView (AbsListView.java:1408) исключение, чем ваш возвращенный View getView(), вероятно, является null.So прежде всего проверьте, что вы не возвращаете нулевой вид.

+0

да это нуль ... вот почему надувание называется .. я догадываюсь – user568021

+0

android.widget.AbsListView.obtainView (AbsListView.java:1408) - это исключение возникает? –

+0

при последней строке return vi; view shuld not null check в этой точке не в начальной точке –

Смежные вопросы