2013-11-19 2 views
0

Кажется, я ударил стену с помощью своего настраиваемого ArrayAdapter. Я начал обращаться к определенным элементам R, в зависимости от типа класса, который прошел, но с тех пор BOOM! (с ниже NPE). Проблема в том, что он не перечисляет ни одного моего кода, и я лечу немного вслепую. Я знаю, что это мой код, потому что комментирование setListAdapter (и других бит) будет работать нормально. Я просто не знаю, что я сделал.Пользовательский ArrayAdapter NullPointerException при вызове setListAdapter()

Я только тестирую ArrayAdapter в данный момент, следовательно, для объектов, создающих цикл. Но, по крайней мере, я знаю, что они не являются нулевыми, поскольку я, насколько я могу, прошел через код.

Любая помощь очень ценится. Я совершенно уверен, что делаю что-то глупое, но прошло уже час, и я пошел слепо!

Большое спасибо.

PS. Я проверил другие вопросы, но большинство из них, похоже, связано с отправкой нулевых объектов или людьми, которые неправильно создают макеты, или создаются экземплярами. Шахта, казалось бы, совершенно разные, как LogCat не отображает ссылки на мой код :(

LogCat:

11-19 13:12:44.968: E/AndroidRuntime(7406): FATAL EXCEPTION: main 
11-19 13:12:44.968: E/AndroidRuntime(7406): java.lang.NullPointerException 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.AbsListView.obtainView(AbsListView.java:1454) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.ListView.makeAndAddView(ListView.java:1745) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.ListView.fillDown(ListView.java:670) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.ListView.fillFromTop(ListView.java:727) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.ListView.layoutChildren(ListView.java:1598) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.AbsListView.onLayout(AbsListView.java:1282) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.view.View.layout(View.java:7175) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.view.View.layout(View.java:7175) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.view.View.layout(View.java:7175) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1140) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.os.Looper.loop(Looper.java:130) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-19 13:12:44.968: E/AndroidRuntime(7406):  at dalvik.system.NativeStart.main(Native Method) 

ListActivity:

package com.goosesys.dta_pta_test; 

import com.goosesys.gooselib.Views.GooseArrayAdapter; 
import com.goosesys.gooselib.Views.GooseDeliveryItem; 
import com.goosesys.gooselib.Interfaces.*; 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.widget.ListView; 
import android.widget.Toast; 

public class DeliveryList extends ListActivity implements OnTaskFinished { 
public String response = ""; 

static String[] vals; 
static String[] vals2; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

    populate(); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id){ 
    String selectedValue = (String)getListAdapter().getItem(position); 
    Toast.makeText(this, selectedValue, Toast.LENGTH_LONG).show(); 
} 

private void populate(){ 
    //new GetFromNetTask(this).execute(AppSettings.DELIV_LIST_URL); 
    GooseDeliveryItem[] deliveries = new GooseDeliveryItem[50]; 

    for(int i=0; i<50; i++){ 
     GooseDeliveryItem gdi = new GooseDeliveryItem(i, "Some Customer " + String.valueOf(i)); 
     deliveries[i] = gdi; 
    } 

    setListAdapter(new GooseArrayAdapter<Object>(this, R.layout.goose_delivery_item, deliveries)); 
    ListView listView = getListView(); 
    listView.setTextFilterEnabled(true); 

    // on click stuff here 

} 

@Override 
public void onTaskFinished(String result) { 
} 
} 

ArrayAdapter:

package com.goosesys.gooselib.Views; 

import com.goosesys.gooselib.R; 

import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 
import android.content.Context; 

public class GooseArrayAdapter<T> extends ArrayAdapter<T> { 
private Context context; 
private int layoutResId; 
T data[] = null; 

public GooseArrayAdapter(Context context, int layoutResId, T[] data){ 
    super(context, layoutResId, data); 

    this.layoutResId = layoutResId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(this.layoutResId, parent, false);   

    T obj = data[position]; 

    //if(obj instanceof GooseDeliveryItem){ 
     //TextView tv = (TextView)rowView.findViewById(R.id.customerName); 
     //tv.setText(((GooseDeliveryItem)obj).customerText); 
    //} 

    return convertView; 
} 
} 

Как я называю намерение из своего основного вида деятельности:

GooseMenuItem gmi2 = (GooseMenuItem)findViewById(R.id.gmiDelivery); 
    gmi2.setHeaderText("DELIVERIES"); 
    gmi2.setDescriptionText("Out and about"); 
    gmi2.setButtonImageSrc(getResources().getDrawable(R.drawable.truck)); 
    gmi2.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(Main.this, DeliveryList.class); 
      startActivity(i); 
     } 
    }); 

Страшного goose_delivery_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/mainContainer" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:background="@color/White" 
android:orientation="horizontal" > 

<TableLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" > 

    <TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <ImageView 
      android:id="@+id/listImage" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:maxHeight="40dp" 
      android:maxWidth="40dp" 
      android:padding="2dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/truck" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" > 

      <TextView 
       android:id="@+id/customerName" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:text="CUSTOMER NAME/ADDRESS" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:textColor="@color/black" /> 

     </LinearLayout> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="left" 
      android:orientation="vertical" > 

      <ImageView 
       android:id="@+id/mapPointImage" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:padding="3dp" 
       android:scaleType="centerInside" 
       android:src="@drawable/mappoint" /> 

     </LinearLayout> 

    </TableRow> 
</TableLayout> 

</RelativeLayout> 
+0

Почему каждый использует внутренний массив для хранения данных в своих массивах ArrayAdapters? – aragaer

ответ

2

Вашей getView функции возвращается null, sinc вы никогда не возвращаете ничего, кроме переданного аргумента. Первоначально convertView будет null, и вам нужно его инициализировать. Впоследствии, если это не null, вы можете просто повторно использовать его.

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

    ... 
    if (convertView == null) { 
     convertView = ... // Create you view here 
    } 

    return convertView; 
} 
+1

О, какой абсолютный twonk ... Мне так стыдно. Приветствия. – LokiSinclair

2

Попробуйте изменить getView к:

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View rowView = inflater.inflate(this.layoutResId, parent, false);   

T obj = data[position]; 

//if(obj instanceof GooseDeliveryItem){ 
    //TextView tv = (TextView)rowView.findViewById(R.id.customerName); 
    //tv.setText(((GooseDeliveryItem)obj).customerText); 
//} 

return rowView ; 
} 

rowView возвращения вместо convertView, так как convertView никогда не назначается

+0

Cheers. Я чувствую себя такой как wally ... :) – LokiSinclair

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