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