【问题标题】:Custom listview adapter size null自定义列表视图适配器大小 null
【发布时间】:2016-08-11 17:49:58
【问题描述】:

目前我正在尝试使用 JSON 填充我的自定义列表视图

它可以很好地处理虚拟数据,我的 json 请求也很好。

所有这些代码都在 onCreate 视图中,我知道我们应该使用异步任务或某种方式来生成一个新线程来提取数据,但我只想把它放在这里用于测试目的,所以我知道我可以提取数据第一的。

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new BasicAuthInterceptor()).addNetworkInterceptor(new StethoInterceptor()).build();

    String url = "http://10.0.2.2:3000/response";

    Request request = new Request.Builder().url(url)
            .build();


    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "call api error");
            Log.e("Volley", e.toString());
        }

        @Override
        public void onResponse(Call call, okhttp3.Response response)  {

            try {
                if (!response.isSuccessful())
                    throw new IOException("Unexpected code " + response);
                final String body = response.body().string();

                JSONObject Jobject = new JSONObject(body);


                JSONArray Jarray = Jobject.getJSONArray("inboxMsgList");

                Log.e("Array", String.valueOf(Jarray.length()));
//Initializing my ArrayLis here I already defined it where I have my other variables defined.
                    arrMessageData = new ArrayList<>();

                JSONObject object = Jarray.getJSONObject(0);

                MessageData msg3 = new MessageData();
                msg3.setName((String) object.get("fromUser"));
                msg3.setMessage((String) object.get("message"));
                msg3.setImage(R.drawable.msgone);
                msg3.setRead(true);
                msg3.setSubject((String) object.get("subject"));

                arrMessageData.add(msg3);

                Log.e("DetailObject", msg3.getName());


                // Log.e("FullJsonReply", body.toString());
            } catch (Exception e){
                Log.e("Volley2", e.toString());
            }

        }

    });


   adapter = new CustomAdapterReferral(getActivity().getBaseContext(), arrMessageData);
    usersListView.setAdapter(adapter);

我得到的错误是:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.util.ArrayList.size()” 在 com.adilpatel.vitalengine.ListAdapters.CustomAdapterReferral.getCount(CustomAdapterReferral.java:40)

第 40 行是我的适配器中的 getCount

public int getCount() {
    return arrMessageData.size();
}

我在返回大小的地方放了一个断点

看起来大小为 1,但它仍然给出空指针异常。是因为适配器为空吗?什么是适配器?

编辑:这是我的 CustomAdapterReferral:

public class CustomAdapterReferral extends BaseAdapter {

    ArrayList<MessageData> arrMessageData;
    Context context;
    private static LayoutInflater inflater = null;

    public CustomAdapterReferral(Context mainActivity, ArrayList<MessageData> arrMessageData){


        this.arrMessageData = arrMessageData;

        context = mainActivity;


        inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }



    public int getCount() {
        return arrMessageData.size();
    }

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

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

    public class ViewHolder {
        TextView referralName;
        ImageView referralImage;
        TextView referralMessage;


    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder=new ViewHolder();

        View rootView = inflater.inflate(R.layout.list_item_referral, null);


        holder.referralName = (TextView) rootView.findViewById(R.id.referralName);
        holder.referralImage =(ImageView) rootView.findViewById(R.id.referralImage);
        holder.referralMessage= (TextView) rootView.findViewById(R.id.referralMessage);

        holder.referralMessage.setText("" + arrMessageData.get(position).getMessage());
        holder.referralName.setText("" + arrMessageData.get(position).getName());
        holder.referralImage.setImageResource(arrMessageData.get(position).getImage());

        return rootView;
    }
}

【问题讨论】:

  • 您能否编辑您的问题以显示课程CustomAdapterReferral
  • @quidproquo 已更新

标签: android json listview


【解决方案1】:

使用处理程序

 private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    adapter = new CustomAdapterReferral(getActivity().getBaseContext(), arrMessageData);
                    usersListView.setAdapter(adapter);
                    break;
                default:
                    Log.d("TAG", msg.what + " ? ");
                    break;
            }
        }
    };

在 OkHttpClient 中使用这个

 @Override
        public void onResponse(Call call, okhttp3.Response response)  {
  //YOUR CODE
 //END
handler.sendEmptyMessage(1);

}

【讨论】:

  • 有效!但是你能解释一下为什么它没有按照我的方式工作吗?似乎它甚至应该通过调试器。
  • 因为使用@ARH 提出的方法,您可以确保在收到请求响应后执行您的代码。
  • 你的代码没有工作,因为这个 var "arrMessageData" 在你想使用它的时候还没有准备好(导致异步线程),所以这个方法等待它准备好然后使用它.
【解决方案2】:

您将Callback 接口传递给enqueue()。您的 arrMessageData 在回调的 onResponse() 中初始化 - 但是在您创建适配器后调用此回调方法,因此您传递给构造函数的 ArrayList 是 null:这会导致 NullPointerException。

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多