I'm new to Android development and I'm stuck at the moment because my getView method in my custom adapter is not being called. I'm trying to display data I'm collecting from an API, parse it, and render it onto a screen in android studio. Please help!
我是Android开发的新手,我现在卡住了,因为我的自定义适配器中的getView方法没有被调用。我正在尝试显示我从API收集的数据,解析它,并将其渲染到android studio的屏幕上。请帮忙!
Here's My Fargment:
这是我的记录:
public class eventsFragment extends Fragment {
View myView;
View rootView;
ArrayList<events> eventList;
private ListView LV;
private ProgressDialog pDialog;
private static String url = "https://kambuku.com/app/tickets";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.events_layout, container, false);
eventList = new ArrayList<>();
LV = (ListView) rootView.findViewById(R.id.List);
//GET CONNECTION INFO
myView = inflater.inflate(R.layout.events_layout, container, false);
ConnectivityManager connectivityManager = (ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
new getAllEvents().execute();
} else {
Toast.makeText(getActivity().getApplicationContext(),
"No Active Connection!",
Toast.LENGTH_LONG)
.show();
}
return myView;
}
private class getAllEvents extends AsyncTask<Void, Void, Void> {
String feed = "";
@Override
protected void onPreExecute() {
super.onPreExecute();
//Show Progress Dialog
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Please wait... Fetching your Events");
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
String Result;
String DEBUG_TAG = "EVENTS";
HttpHandler handle = new HttpHandler();
String jsonStr = null;
try {
jsonStr = handle.EventsConnection(url, DEBUG_TAG);
} catch (IOException e) {
e.printStackTrace();
}
Result = jsonStr;
Log.e(DEBUG_TAG, "JSON RESPONSE IS" + Result);
if (Result != null) {
try {
JSONObject jsonObject = new JSONObject(Result);
Log.e(DEBUG_TAG, "JSON OBJECT IS" + jsonObject);
//GET JSON ARRAY NODE
JSONArray tickets = jsonObject.getJSONArray("tickets");
Log.e(DEBUG_TAG, "JSON TICKET ARRAY LENGTH IS" + tickets.length());
for (int i = 0; i < tickets.length(); i++) {
JSONObject t = tickets.getJSONObject(i);
Log.e(DEBUG_TAG, "JSON OBJECT " + i + " is " + t);
events event = new events();
event.setEventName(t.getString("eventName"));
event.setId(t.getString("id"));
event.setVenue(t.getString("venue"));
event.setCity(t.getString("city"));
event.setArtwork("https://kambuku.com/"+t.getString("artwork"));
event.setHost(t.getString("host"));
event.setNotes(t.getString("notes"));
event.setPrice(t.getString("price"));
event.setEventDate(t.getString("eventDate"));
eventList.add(event);
}
} catch (final JSONException e) {
Log.e(DEBUG_TAG, "Json parsing error: " + e.getMessage());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e(DEBUG_TAG, "Couldn't get json from server.");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.e("PostExecute", "YOUR LIST ARE "+eventList);
eventsAdapter eventAdapter = new eventsAdapter(getActivity().getApplicationContext(), R.layout.event_item, eventList);
LV.setAdapter(eventAdapter);
if (pDialog.isShowing())
pDialog.dismiss();
}
}
}
Here's My Adapter:
这是我的适配器:
public class eventsAdapter extends ArrayAdapter {
private ArrayList<events> ArrayListEvents;
private int Resource;
private Context context;
private LayoutInflater inflater;
public eventsAdapter(Context context, int resource, ArrayList<events> objects) {
super(context, resource, objects);
Log.e("ADAPTER", "OBJECTS ARE "+objects);
Log.e("ADAPTER", "RESOURCES ARE "+resource);
ArrayListEvents = objects;
Resource = resource;
this.context = context;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("ADAPTER", "WE ARE HERE");
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(Resource, null);
holder = new ViewHolder();
holder.artwork = (ImageView) convertView.findViewById(R.id.Artwork);
holder.eventName = (TextView) convertView.findViewById(R.id.eventName);
holder.eventNotes = (TextView) convertView.findViewById(R.id.eventNotes);
convertView.setTag(holder);
} else {
holder = (eventsAdapter.ViewHolder)convertView.getTag();
}
new DownloadImageResource(holder.artwork).execute(ArrayListEvents.get(position).getArtwork());
holder.eventName.setText(ArrayListEvents.get(position).getEventName());
holder.eventNotes.setText(ArrayListEvents.get(position).getNotes());
Log.e("Holder", "Holder"+holder.eventName.getText());
return convertView;
}
private static class ViewHolder {
ImageView artwork;
TextView eventName;
TextView eventNotes;
}
private class DownloadImageResource extends AsyncTask<String, Void, Bitmap>
{
ImageView Artwork;
DownloadImageResource(ImageView Artwork)
{
this.Artwork = Artwork;
}
protected Bitmap doInBackground(String... urls)
{
String urlDisplay = urls[0];
Bitmap conn = null;
try
{
InputStream inputStream = new java.net.URL(urlDisplay).openStream();
conn = BitmapFactory.decodeStream(inputStream);
}catch (Exception e){
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return conn;
}
protected void onPostExecute(Bitmap result)
{
Log.e("Image", "Image Download"+result);
Artwork.setImageBitmap(result);
}
}
}
2 个解决方案
#1
0
Override getItemCount method in your adapter.
覆盖适配器中的getItemCount方法。
@Override public int getItemCount() { return ArrayListEvents .size(); }
@Override public int getItemCount(){return ArrayListEvents .size(); }
#2
0
Your problem is you are executing nested AsyncTask. I.e. you are running another task for each row in the listview, which is already running a task. This is not good in Android. See this question for more details.
您的问题是您正在执行嵌套的AsyncTask。即您正在为列表视图中的每一行运行另一个任务,该任务已在运行任务。这在Android中并不好。有关详细信息,请参阅此问题。
#1
0
Override getItemCount method in your adapter.
覆盖适配器中的getItemCount方法。
@Override public int getItemCount() { return ArrayListEvents .size(); }
@Override public int getItemCount(){return ArrayListEvents .size(); }
#2
0
Your problem is you are executing nested AsyncTask. I.e. you are running another task for each row in the listview, which is already running a task. This is not good in Android. See this question for more details.
您的问题是您正在执行嵌套的AsyncTask。即您正在为列表视图中的每一行运行另一个任务,该任务已在运行任务。这在Android中并不好。有关详细信息,请参阅此问题。