[英]Retrofit: java.lang.NullPointerException
NullPointerException and No adapter attached; NullPointerException并且没有连接适配器; skipping layout occurs everytime I test this app on the gennymotion.i have read other questions related to same problem but none help.
每次我在gennymotion.net上测试该应用程序时,都会发生布局跳变。我已经阅读了与同一问题相关的其他问题,但没有帮助。
logcat 日志猫
09-20 13:21:13.738 4658-4658/com.example.kiran.detailapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kiran.detailapp, PID: 4658 java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.example.kiran.detailapp.RecyclerAdapter.getItemCount(RecyclerAdapter.java:38) at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3493) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3019) at android.view.View.measure(View.java:17430) at android.widget.RelativeLayout.measureChild(RelativeLayout.java:697) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.j 09-20 13:21:13.738 4658-4658 / com.example.kiran.detailapp E / AndroidRuntime:致命例外:主进程:com.example.kiran.detailapp,PID:4658 java.lang.NullPointerException:尝试调用接口com.example.kiran.detailapp.RecyclerAdapter.getItemCount(RecyclerAdapter.java:38)上的NULL对象引用上的方法'int java.util.List.size()',位于android.support.v7.widget.RecyclerView.dispatchLayoutStep1( android.support.v7.widget上的RecyclerView.java:3493)android.widget.RelativeLayout.measureChild(RelativeLayout)上android.view.View.measure(View.java:17430)上的RecyclerView.onMeasure(RecyclerView.java:3019) .java:697)android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)android.view.View.measure(View.java:17430)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.widget.FrameLayout.onMeasure(FrameLayout.java:430)在android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)在android.view.View.measure(View.j) ava:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) at android.view.View.measure(View.java:1743
ava:17430)在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)在android.view.View.measure(View.java :17430),位于android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463),位于android.widget.FrameLayout.onMeasure(FrameLayout.java:430),位于android.view.View.measure(View.java:17430) .view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)在android.widget.LinearLayout.measureVertical(LinearLayout.java:722)在android.widget.LinearLayout。在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.view.View.measure(View.java:17430)在android.widget.FrameLayout.onMeasure(FrameLayout.java :430),位于com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2560),位于android.view.View.measure(View.java:1743 0) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAnd
0)在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)在android。 android.view.View.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5779)的view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767) android.view.Choreographer.doCallbacks(Choreographer.java:580).android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)上的Choreographer.doFrame(Choreographer.java:550)。 android.os.Handler.dispatchMessage(Handler.java:95)的handleCallback(Handler.java:739)android.app.ActivityThread.main(ActivityThread.java)的android.os.Looper.loop(Looper.java:135)的handleCallback(Handler.java:739) :5221),位于java.lang.reflect.Method.invoke(本机方法),位于com.android.internal.os.ZygoteInit $ MethodAnd处的java.lang.reflect.Method.invoke(Method.java:372) ArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)上的ArgsCaller.run(ZygoteInit.java:899)
Contact.java Contact.java
package com.example.kiran.detailapp;
import com.google.gson.annotations.SerializedName;
public class Contact {
@SerializedName("name")
private String Name;
@SerializedName("email")
private String Email;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
}
ApiClient.java ApiClient.java
package com.example.kiran.detailapp;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BASE_URL = "http://10.0.3.2/ContactApp/";
public static Retrofit retrofit = null;
public static Retrofit getApiClient()
{
retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).build();
return retrofit;
}
}
ApiInterface.java ApiInterface.java
package com.example.kiran.detailapp;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.POST;
public interface ApiInterface {
@POST("ReadContacts.php")
Call<List<Contact>> getContacts();
}
RecyclerAdapter.java RecyclerAdapter.java
package com.example.kiran.detailapp;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.util.List;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private List<Contact> contacts;
public RecyclerAdapter(List<Contact> contacts)
{
this.contacts = contacts;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.Name.setText(contacts.get(position).getName());
holder.Email.setText(contacts.get(position).getEmail());
}
@Override
public int getItemCount() {
return contacts.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView Name,Email;
public MyViewHolder(View itemView) {
super(itemView);
Name = (TextView) itemView.findViewById(R.id.name);
Email = (TextView) itemView.findViewById(R.id.email);
}
}
}
MainActivity.java MainActivity.java
package com.example.kiran.detailapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerAdapter adapter;
private List<Contact> contacts;
private ApiInterface apiInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new RecyclerAdapter(contacts);
recyclerView = (RecyclerView) findViewById(R.id.Recycleview);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
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();
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<Contact>> call, Throwable t) {
}
});
}
}
You forgot to initialize the arraylist 您忘了初始化arraylist
private List<Contact> contacts;
then in onCreate()
do this 然后在
onCreate()
执行此操作
contacts= new ArrayList<>();
I see some issues in the code. 我在代码中看到了一些问题。
1) your contacts
var is going un initialized inside the adapter. 1)您的
contacts
var在适配器内部未初始化。
2) You have set recyclerview inside onResponse
method which is running in background thread. 2)您已经在后台线程中运行的
onResponse
方法中设置了recyclerview。
Solution: 解:
You need to initialize contacts and then give them values in onResponse
method and set adapter on activity's
runOnUiThread
method. 您需要初始化联系人,然后在
onResponse
方法中为它们提供值,并在activity's
runOnUiThread
方法上设置适配器。
Hope this code will help. 希望这段代码对您有所帮助。
1) initialise contacts 1)初始化联系人
private List<Contact> contacts = new ArrayList<>();
2) give expected values in onResponse
method and initialize adapter there and remove initialization form onCreate
method. 2)在
onResponse
方法中给出期望值,并在onResponse
初始化适配器,并从onCreate
方法中删除初始化形式。
call.enqueue(new Callback<List<Contact>>() {
@Override
public void onResponse(Call<List<Contact>> call, Response<List<Contact>> response) {
contacts = response.body();
adapter = new RecyclerAdapter(contacts);
runOnUiThread(() -> {
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
});
}
@Override
public void onFailure(Call<List<Contact>> call, Throwable t) {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.