2017-06-24 52 views
0

我在適配器類中出現nullPointException。如何在列表視圖中使用Retrofit獲取數據

我想從包含名稱和電子郵件的服務器獲得聯繫。 我聯繫類是

public class Contact { 

@SerializedName("name") 
private String Name; 

@SerializedName("email") 
private String Email; 


public String getName() { 
    return Name; 
} 

public String getEmail() { 
    return Email; 
} 

}

ApiClient類

public class ApiClient { 

private static final String BASE_URL = "http://192.168.43.88/ContactApp/"; 
public static Retrofit retrofit = null; 

public static Retrofit getApiClient(){ 

    if (retrofit == null){ 
     retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build(); 
    } 

    return retrofit; 
} 

}

這就是我得到空指針異常在infalter適配器類

公共類RetrofitItemAdapter延伸BaseAdapter {

Context mContext; 
private List<Contact> mContact; 
RecyclerView.ViewHolder vh = null; 

//Constructor 


public RetrofitItemAdapter(List<Contact> mContact) { 

    this.mContact = mContact; 
} 


public class ViewHolder { 

    public TextView tvName; 
    public TextView tvEmail; 


} 


@Override 
public int getCount() { 
    return mContact.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mContact.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    View vi = convertView; 
    ViewHolder holder; 

    if (convertView == null) { 

     LayoutInflater inflater; 
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     vi = inflater.inflate(R.layout.listview_retrofit_items, null); 

     holder = new ViewHolder(); 
     holder.tvName = (TextView) vi.findViewById(R.id.tv_ret_name); 
     holder.tvEmail = (TextView) vi.findViewById(R.id.tv_ret_email); 


     vi.setTag(holder); 

    } else 
     holder = (ViewHolder) vi.getTag(); 

    // now set your text view here like 

    // holder.tvName.setText("Bla Bla Bla"); 

    holder.tvName.setText(mContact.get(position).getName()); 
    holder.tvEmail.setText(mContact.get(position).getEmail()); 


    // return your view 
    return vi; 

,最後我的主類是

public class RetrofitDemo extends AppCompatActivity { 

private ListView listView; 
private List<Contact> contacts; 
private RetrofitItemAdapter adapter; 
private ApiInterface apiInterface; 


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

    listView = (ListView)findViewById(R.id.lv_retrofitData); 

    apiInterface = ApiClient.getApiClient().create(ApiInterface.class); 
    Call<List<Contact>> call = apiInterface.getContacts(); 

    call.enqueue(new Callback<List<Contact>>() { 
     @Override 
     public void onResponse(Call<List<Contact>> call, Response<List<Contact>> response) { 

      contacts = response.body(); 

      adapter = new RetrofitItemAdapter(contacts); 
      listView.setAdapter(adapter); 

     } 

     @Override 
     public void onFailure(Call<List<Contact>> call, Throwable t) { 

     } 
    }); 

} 

}

logcat的錯誤

E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.example.admin.myapplication, PID: 2528 
              java.lang.NullPointerException 
               at com.example.admin.myapplication.RetrofitItemAdapter.getView(RetrofitItemAdapter.java:66) 
               at android.widget.AbsListView.obtainView(AbsListView.java) 
               at android.widget.ListView.makeAndAddView(ListView.java:1790) 
               at android.widget.ListView.fillDown(ListView.java:691) 
               at android.widget.ListView.fillFromTop(ListView.java:752) 
               at android.widget.ListView.layoutChildren(ListView.java:1630) 
               at android.widget.AbsListView.onLayout(AbsListView.java) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
               at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
               at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
               at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
               at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
               at android.view.View.layout(View.java:14834) 
               at android.view.ViewGroup.layout(ViewGroup.java:4631) 
               at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1988) 
               at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1745) 
               at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1001) 
               at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5623) 
               at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
               at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
               at android.view.Choreographer.doFrame(Choreographer.java:544) 
               at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
               at android.os.Handler.handleCallback(Handler.java:733) 
               at android.os.Handler.dispatchMessage(Handler.java:95) 
               at android.os.Looper.loop(Looper.java:136) 
               at android.app.ActivityThread.main(ActivityThread.java:5241) 
               at java.lang.reflect.Method.invokeNative(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:515) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
               at dalvik.system.NativeStart.main(Native Method) 

哪裏是我的錯,請幫幫我 謝謝

+0

請分享你的錯誤的logcat的輸出 – stamanuel

+0

致命例外:main 進程:com.example.admin.myapplication,PID:2528 java.lang.NullPointerException at com.example.admin.myapplication.Retrof itItemAdapter.getView(RetrofitItemAdapter.java:66) at android.widget.AbsListView.obtainView(AbsListView.java) –

+0

好吧,你會發現崩潰出現在你的RetrofitItemAdapter.java的第66行。現在如果你願意共享更多的logcat輸出也許我們可以看到爲什麼有一個空指針。因爲我猜66行在文件中的位置與您發佈的行不同,因爲您沒有包含導入。 – stamanuel

回答

1

您沒有設置在適配器中創建的上下文對象。

您需要設置了通過傳遞活動情境與您傳遞到適配器

public RetrofitItemAdapter(List<Contact> mContact, Context context) { 
    this.mContact = mContact; 
    this.mContext = context; 
} 

而且在活動觸點沿

adapter = new RetrofitItemAdapter(contacts, RetrofitDemo.this); 
    listView.setAdapter(adapter); 
+0

謝謝先生...我的程序正在運行:) –

+1

很高興它幫助! :)快樂編碼@SayedRizwanHashmi – Sanoop

相關問題