Android RecyclerView不显示从localhost发送的JSON只是空白屏幕

Android RecyclerView不显示从localhost发送的JSON只是空白屏幕,android,android-recyclerview,android-asynctask,Android,Android Recyclerview,Android Asynctask,大家好,我对AsyncTask没有太多的经验,这是我第一次使用RecyclerView,除了我为了解它而做的一些教程之外 如果我在EventActivity中使用虚拟数据,一切正常,屏幕上会显示一个列表。但当我创建EventItems的ArrayList并将其传递给适配器时,它只是一个空白屏幕。正在解析来自localhost的JSON并将其发送到EventItem类。我尝试了几种方法让它工作,但由于我在AsyncTask和RecyclerView方面的经验有限,我最终导致应用程序崩溃并出现空指针

大家好,我对AsyncTask没有太多的经验,这是我第一次使用RecyclerView,除了我为了解它而做的一些教程之外

如果我在EventActivity中使用虚拟数据,一切正常,屏幕上会显示一个列表。但当我创建EventItems的ArrayList并将其传递给适配器时,它只是一个空白屏幕。正在解析来自localhost的JSON并将其发送到EventItem类。我尝试了几种方法让它工作,但由于我在AsyncTask和RecyclerView方面的经验有限,我最终导致应用程序崩溃并出现空指针异常

我认为,在JSON已经从本地主机检索之前,正在创建RealReVIEW,这是导致空白屏幕或空指针异常的原因,但我不确定100%,如果正确的话,我不知道如何修复这个问题。

感谢您的帮助

事件活动

public class EventActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);
        fetchEvents();//call EventBackgroundWorker

        //ArrayList<EventItem> eventList = new EventItem().getRecyclerList();//causes java null pointer exception
        ArrayList<EventItem> eventList = new ArrayList<>();


        //Dummie data
       // eventList.add(new EventItem (1, "Title1", "Date", "endDate", "Location1", 5, 1111));
       // eventList.add(new EventItem (R.drawable.ic_favourite, "Title2", "11/07/2018", "11/07/2018", "Wales", 10, 5));
       // eventList.add(new EventItem (R.drawable.ramspeed_custom, "Title3", "11/01/2018", "11/09/2018", "Paris, France", 0, 90));
       // eventList.add(new EventItem (R.drawable.ramspeed_custom, "Title4", "12/01/2018", "11/09/2018", "New York", 20, 500));
       // eventList.add(new EventItem (R.drawable.ic_favourite, "Title5", "Mon 11/05/2015", "11/09/2018", "London, England", 5, 500));
       // eventList.add(new EventItem (R.drawable.biker, "Title6", "Mon 11/05/2018", "20/07/2018", "Swords Dublin", 0, 500));

        mRecyclerView = (RecyclerView) findViewById(R.id.event_recycler_view);
        mRecyclerView.setHasFixedSize(true);//increase performance of app if recyclerView does not increase in size
        mLayoutManager = new LinearLayoutManager(this);
        // mAdapter = new EventAdapter(eventList);
        mAdapter = new EventAdapter(eventList);//context added for testing //////////////////////////////
        // mAdapter = new EventAdapter(new ArrayList<EventItem>(0));
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);


       // buildRecyclerView();
    }


//run  background thread
    private void fetchEvents(){
       // String username = "user";
       // String userPassword = "password";
        String startConnectionCondition = "event";
        //this passes the context
        EventBackgroundWorker backgroundWorker = new EventBackgroundWorker(this);
        backgroundWorker.execute(startConnectionCondition, null);
    }

 /*   private void buildRecyclerView(){
        ArrayList<EventItem> eventList = new EventItem().getRecyclerList();

        mRecyclerView = (RecyclerView) findViewById(R.id.event_recycler_view);
        mRecyclerView.setHasFixedSize(true);//increase performance of app if recyclerView does not increase in size
        mLayoutManager = new LinearLayoutManager(this);
        // mAdapter = new EventAdapter(eventList);
        mAdapter = new EventAdapter(eventList);//context added for testing 
        // mAdapter = new EventAdapter(new ArrayList<EventItem>(0));
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
    }
*/
   /* public void showEventList(boolean b){
        ArrayList<EventItem> eventList = new ArrayList<>();
        for(int i =0; i< eventList.size(); i++){
            eventList.get(i);
            Log.d("tag","eventList from main " + eventList);
        }

        mAdapter = new EventAdapter(eventList);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
    }*/
}//MainActivity
公共类EventActivity扩展了AppCompative活动{
私人回收视图mRecyclerView;
专用回收器查看适配器mAdapter;
private RecyclerView.LayoutManager MLLayoutManager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_事件);
fetchEvents();//调用EventBackgroundWorker
//ArrayList eventList=new EventItem().getRecyclerList();//导致java空指针异常
ArrayList eventList=新建ArrayList();
//虚拟数据
//添加(新的事件项(1,“标题1”,“日期”,“结束日期”,“位置1”,51111));
//事件列表。添加(新事件项(R.drawable.ic_Favorite,“标题2”,“2018年7月11日”,“2018年7月11日”,“威尔士”,10,5));
//事件列表。添加(新的事件项(R.drawable.ramspeed_custom,“标题3”,“2018年1月11日”,“2018年9月11日”,“法国巴黎”,0,90));
//事件列表。添加(新事件项(R.drawable.ramspeed_定制,“标题4”、“2018年1月12日”、“2018年9月11日”、“纽约”20500);
//事件列表。添加(新事件项(R.drawable.ic_Favorite,“标题5”,“2015年5月11日星期一”,“2018年9月11日”,“英国伦敦”,5500));
//事件列表。添加(新事件项(R.drawable.biker,“标题6”,“2018年5月11日星期一”,“2018年7月20日”,“都柏林剑”,0,500);
mRecyclerView=(RecyclerView)findViewById(R.id.event\u recycler\u view);
mRecyclerView.setHasFixedSize(true);//如果recyclerView的大小没有增加,则提高应用程序的性能
mLayoutManager=新的LinearLayoutManager(此);
//mAdapter=新的事件适配器(事件列表);
mAdapter=neweventadapter(eventList);//为测试添加了上下文//////////////////////////////
//mAdapter=neweventadapter(newarraylist(0));
mRecyclerView.setLayoutManager(mllayoutmanager);
mRecyclerView.setAdapter(mAdapter);
//buildRecyclerView();
}
//运行后台线程
私有void fetchEvents(){
//字符串username=“user”;
//字符串userPassword=“password”;
字符串startConnectionCondition=“事件”;
//这就通过了上下文
EventBackgroundWorker backgroundWorker=新的EventBackgroundWorker(此);
backgroundWorker.execute(startConnectionCondition,null);
}
/*私有void buildRecyclerView(){
ArrayList eventList=新建EventItem().getRecyclerList();
mRecyclerView=(RecyclerView)findViewById(R.id.event\u recycler\u view);
mRecyclerView.setHasFixedSize(true);//如果recyclerView的大小没有增加,则提高应用程序的性能
mLayoutManager=新的LinearLayoutManager(此);
//mAdapter=新的事件适配器(事件列表);
mAdapter=neweventadapter(eventList);//为测试添加了上下文
//mAdapter=neweventadapter(newarraylist(0));
mRecyclerView.setLayoutManager(mllayoutmanager);
mRecyclerView.setAdapter(mAdapter);
}
*/
/*公共void showEventList(布尔b){
ArrayList eventList=新建ArrayList();
对于(int i=0;i
事件适配器

public class EventAdapter extends RecyclerView.Adapter<EventAdapter.EventViewHolder> {
    private ArrayList<EventItem> mEventList;
    Context context;

    //constructor for EventAdapter
    public EventAdapter(ArrayList<EventItem> eventList){
        // context =c;
        mEventList = eventList;
        Log.d("tag","EventAdapter eventlist variable called from constructor " + eventList);
    }


    public static class EventViewHolder extends RecyclerView.ViewHolder{
        public ImageView mPromoImage;
        public TextView mTitle;
        public TextView mStartDate;
        public TextView mEndDate;
        public TextView mLocation;
        public TextView mFee;
        public ImageView mFavourite;

        //constructor for EventViewHolder class
        public EventViewHolder(View itemView) {
            super(itemView);
          //  mPromoImage = (ImageView) itemView.findViewById(R.id.event_promotional_image);
            mTitle = (TextView) itemView.findViewById(R.id.event_title_textView);
            mStartDate = (TextView) itemView.findViewById(R.id.event_start_textView);
            mEndDate = (TextView) itemView.findViewById(R.id.event_end_textView);
            mLocation = (TextView) itemView.findViewById(R.id.event_location_textView);
            mFee = (TextView) itemView.findViewById(R.id.event_fee_textView);
         //   mFavourite = (ImageView) itemView.findViewById(R.id.event_favourite_image);
            Log.d("tag", "EventViewHolder being called");
        }
    }//EventViewHolder class



    @Override
    public EventViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_event, parent, false);
        //create view holder
        EventViewHolder viewHolder = new EventViewHolder(v);
        return viewHolder;
    }

    //pass values to inflated XML Views in item_event.xml
    @Override
    public void onBindViewHolder(EventViewHolder holder, int position) {
        EventItem currentEvent = mEventList.get(position);
      //  holder.mPromoImage.setImageResource(currentEvent.getEventPromoImage());
        holder.mTitle.setText(currentEvent.getEventTitle());
        holder.mStartDate.setText(currentEvent.getEventStartDate());
        holder.mEndDate.setText(currentEvent.getEventEndDate());
        holder.mLocation.setText(currentEvent.getEventLocation());
        holder.mFee.setText(String.valueOf(currentEvent.getEventFee()));//int value passed
      //  holder.mFavourite.setImageResource(currentEvent.getEventFavourite());
        //Log.d("tag", "position" + position );
        Log.d("tag","eventAdapter " + currentEvent.getEventTitle());
    }

    //how many items there will be
    @Override
    public int getItemCount() {
        return mEventList.size();
    }
}
公共类EventAdapter扩展了RecyclerView.Adapter{ 私人ArrayList mEventList; 语境; //EventAdapter的构造函数 公共事件适配器(ArrayList事件列表){ //上下文=c; mEventList=事件列表; Log.d(“标记”,“从构造函数调用的EventAdapter eventlist变量”+eventlist); } 公共静态类EventViewHolder扩展了RecyclerView.ViewHolder{ 公共图像查看mPromoImage; 公共文本视图mTitle; 公共文本视图mStartDate; 公共文本查看日期; 公共文本视图位置; 公共文本视图mFee; 公共图像视图mFavourite; //EventViewHolder类的构造函数 公共事件视图持有者(视图项视图){ 超级(项目视图); //mPromoImage=(ImageView)itemView.findViewById(R.id.event\u promotional\u image); mTitle=(TextView)itemView.findViewById(R.id.event\u title\u TextView); mStartDate=(TextView)itemView.findViewById(R.id.event\u start\u TextView); mEndDate=(TextView)itemView.findViewById(R.id.event\u end\u TextView); mLocation=(TextView)itemView.findViewById(R.id.event\u location\u TextView); mFee=(TextView)itemView.findViewById(R.id.event\u fee\u TextView); //mFavourite=(ImageView)itemView.findViewById(R.id.event\u favorite\u image); Log.d(“标记”,“调用EventViewHolder”); } }//EventViewHolder类 @凌驾 public EventViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=LayoutFlater.from(parent.ge
public class EventItem {
    private int mEventPromoImage;
    private int mId;
    private String mEventTitle;
    private String mEventStartDate;
    private String mEventEndDate;
    private String mEventLocation;
    private int mEventFee;
    private int mEventViews;


   // public EventItem(){}

    public EventItem(int id, String eventTitle, String eventStartDate,
                     String eventEndDate, String eventLocation, int eventFee, int eventViews){
       // mEventPromoImage = eventPromoImage;
        mId = id;
        mEventTitle = eventTitle;
        mEventStartDate = eventStartDate;
        mEventEndDate = eventEndDate;
        mEventLocation = eventLocation;
        mEventFee = eventFee;
        mEventViews = eventViews;
        Log.d("tag","EVENTITEM title EventItem" + mEventTitle);
      //  Log.d("tag","EVENTITEM startDate EventItem" + mEventStartDate );
      //  Log.d("tag","EVENTITEM endDate EventItem" + mEventEndDate );
      //  Log.d("tag","EVENTITEM address EventItem" + mEventLocation);
      //  Log.d("tag","EVENTITEM fee EventItem" + mEventFee);
    }



    public int getEventPromoImage() {
        return mEventPromoImage;
    }

    public void setEventPromoImage(int mEventPromoImage) {
        this.mEventPromoImage = mEventPromoImage;
    }

    public int getEventId() {
        return mId;
    }

    public void setEventId(int mId){
        this.mId = mId;
    }

    public String getEventTitle() {
        Log.d("tag","getEventTitle() " + mEventTitle);
        return mEventTitle;
    }

    public void setEventTitle(String mEventTitle) {
        this.mEventTitle = mEventTitle;
    }

    public String getEventStartDate() {
        return mEventStartDate;
    }

    public void setEventStartDate(String mEventStartDate) {
        this.mEventStartDate = mEventStartDate;
    }

    public String getEventEndDate(){
        return mEventEndDate;
    }

    public void setEventEndDate(String mEventEndDate){
        this.mEventEndDate = mEventEndDate;
    }

    public String getEventLocation() {
        return mEventLocation;
    }

    public void setEventLocation(String mEventLocation) {
        this.mEventLocation = mEventLocation;
    }

    public int getEventFee() {
        return mEventFee;
    }

    public void setEventFee(int mEventFee) {
        this.mEventFee = mEventFee;
    }

    public int getEventViews(){
        return mEventViews;
    }

    public void getEventViews(int mEventViews) {
        this.mEventViews = mEventViews;
    }

    public ArrayList<EventItem> getRecyclerList(){
        ArrayList event = new ArrayList();
        event.add(mEventTitle);
        event.add(mEventStartDate);
        event.add(mEventEndDate);
        event.add(mEventLocation);
        event.add(mEventFee);
        event.add(mEventViews);
        return event;
    }
}
public class EventBackgroundWorker extends AsyncTask<String, Void, String> {
    Context context;
    AlertDialog alert;
    public static final String REQUEST_URL = "http://10.0.2.2/m/event/";

    public EventBackgroundWorker(Context ctxt) {
        context = ctxt;
    }

    //Invoked on UI thread before doInBackground is called
    @Override
    protected void onPreExecute() {
        alert = new AlertDialog.Builder(context).create();
        alert.setTitle("Result from server");

    }

    @Override
    protected String doInBackground(String... params) {
        String type = params[0];//eventList
        //String login_url = "http://10.0.2.2/m/event/";
        if(type.equals("event")){
            try {
                String user_name = params[1];
                URL url = new URL(REQUEST_URL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                httpURLConnection.connect();//works without this connect Find out why

                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("getEvents", "UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();

                //read response
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));
                String result = "";
                String line;
                while((line = bufferedReader.readLine()) != null){
                    result += line;
                }

                //parse JSON event Array

                // Create an empty ArrayList that we can start adding events to
                ArrayList<EventItem> eventArray = new ArrayList<>();

                JSONArray baseJsonResponse = new JSONArray(result);
                for(int i =0; i < baseJsonResponse.length(); i++){
                    JSONObject event = baseJsonResponse.getJSONObject(i);
                    int id = event.getInt("id");
                    String title = event.getString("title");
                    String address = event.getString("address");
                    String startDate = event.getString("startDate");
                    String endDate = event.getString("endDate");
                    int fee = event.getInt("fee");
                    int views = event.getInt("views");

                    //Send data to eventItem Object
                    EventItem eventObject = new EventItem(id,title,address,startDate,endDate,fee,views);
                    eventArray.add(eventObject);
                  /*  Log.d("tag", "JSON id " + id);
                    Log.d("tag", "JSON title " + title);
                    Log.d("tag", "JSON address " + address);
                    Log.d("tag", "JSON startDate " + startDate);
                    Log.d("tag", "JSON endDate " + endDate);
                    Log.d("tag", "JSON fee " + fee);
                    Log.d("tag", "JSON views " + views);*/
                }

                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();

                return result;

            } catch (MalformedURLException e) {//added for URL object
                e.printStackTrace();
            } catch (IOException e) {
                //HTPURLConnection
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    //results from doInBackground are passed here
    @Override
    protected void onPostExecute(String result) {
        Log.d("tag", "onPostExecute called" + result);
        alert.setMessage(result);
        alert.show();

    }

}