Java AsyncTask和RecyclerView Don';t在Internet上显示从JSON获取的内容
我正在制作一个简单的程序,在这里我可以从这个url中的JSON获取内容 并在Android上使用RecyclerView将其列为一个列表 我已经制作了一些必要的组件,如模型、适配器、Post行项目和HttpHandler 当我尝试使用像这样的方法进行RecyclerView时,它是有效的Java AsyncTask和RecyclerView Don';t在Internet上显示从JSON获取的内容,java,android,json,android-recyclerview,android-asynctask,Java,Android,Json,Android Recyclerview,Android Asynctask,我正在制作一个简单的程序,在这里我可以从这个url中的JSON获取内容 并在Android上使用RecyclerView将其列为一个列表 我已经制作了一些必要的组件,如模型、适配器、Post行项目和HttpHandler 当我尝试使用像这样的方法进行RecyclerView时,它是有效的 private void addData () { postsArrayList = new ArrayList <> (); postsArrayList.add (new Po
private void addData () {
postsArrayList = new ArrayList <> ();
postsArrayList.add (new Posts ("TITLE", "SUMMARY"));
}
postRecycleServiceAdapter.java
package com.badjing.bloggercoba.adapter;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入com.badjing.bloggercoba.R;
导入com.badjing.bloggercoba.model.Posts;
导入java.util.ArrayList;
公共类PostRecycleServiceAdapter扩展了RecyclerView.Adapter{
私人ArrayList postsList;
公共PostRecycleServiceAdapter(ArrayList postsArrayList){
this.postsList=postsArrayList;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
LayoutInflater LayoutInflater=LayoutInflater.from(parent.getContext());
视图=布局更平坦。充气(R.layout.post\u行\u项,父项,false);
返回新的MyViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder,int位置){
holder.blog\u post\u title.setText(postsList.get(position.getTitle());
holder.blog\u post\sumary.setText(postsList.get(position.getSummary());
}
@凌驾
public int getItemCount(){
return(postsList!=null)?postsList.size():0;
}
公共静态类MyViewHolder扩展了RecyclerView.ViewHolder{
TextView博客文章标题、博客文章摘要、博客文章作者;
图像视图img_缩略图;
公共MyViewHolder(查看项目视图){
超级(项目视图);
blog\u post\u title=itemviewbyd(R.id.blog\u post\u title);
blog\u post\u sumary=itemviewbyd(R.id.blog\u post\u sumary);
//blog\u post\u author=itemView.findviewbyd(R.id.blog\u post\u author);
//img_缩略图=itemviewbyd(R.id.post_缩略图);
}
}
}
post\u row\u item.xml
感谢您的关注和帮助。GetContent类是异步调用,因此可能需要一些时间才能获得API结果。因此,当您在GetContent类add
adapter.notifyDataSetChanged()
中将一个或多个项目添加到postsArrayList后,必须在RecyclerView.adapter上调用notifyDataSetChanged()
,才能完全获得postsArrayList
。您可以在AsyncTask中重写onPostExecute()
,因为此方法将在UI线程上执行。还有一件事:在doInBackground()
中,循环中只有一个Posts
的实例postsModel,您可以不断更改它并将其重复添加到列表中。但由于列表中的所有项都指向同一实例,因此它们都将具有相同的值。TL;DR您需要为每个列表项创建一个新的Posts
实例感谢bro的帮助,它的workGetContent类是异步调用,因此可能需要一些时间才能获得API结果。因此,当您在GetContent类addadapter.notifyDataSetChanged()
中将一个或多个项目添加到postsArrayList后,必须在RecyclerView.adapter上调用notifyDataSetChanged()
,才能完全获得postsArrayList
。您可以在AsyncTask中重写onPostExecute()
,因为此方法将在UI线程上执行。还有一件事:在doInBackground()
中,循环中只有一个Posts
的实例postsModel,您可以不断更改它并将其重复添加到列表中。但由于列表中的所有项都指向同一实例,因此它们都将具有相同的值。TL;DR您需要为每个列表项创建一个新的Posts
实例感谢bro的帮助和帮助
private class getContent extends AsyncTask <Void, Void, Void> {
@ Override
protected Void doInBackground (Void ... voids) {
HttpHandler sh = new HttpHandler ();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall (URL_FIX);
if (jsonStr! = null) {
try {
JSONObject jsonObj = new JSONObject (jsonStr);
JSONObject feed = jsonObj.getJSONObject ("feed");
JSONArray entry = feed.getJSONArray ("entry");
Posts postsModel = new Posts ();
for (int i = 0; i <entry.length (); i ++) {
postsModel.setTitle (entry.getJSONObject (i) .getJSONObject ("title"). getString ("$ t"));
postsModel.setSummary (entry.getJSONObject (i) .getJSONObject ("summary"). getString ("$ t"));
postsArrayList.add (postsModel);
}
} catch (final JSONException e) {
Log.e ("RESPONSE", "Json parsing error:" + e.getMessage ());
runOnUiThread (new Runnable () {
@ Override
public void run () {
Toast.makeText (getApplicationContext (),
"Json parsing error:" + e.getMessage (),
Toast.LENGTH_LONG)
.show ();
}
});
}
} else {
Log.e ("RESPONSE", "Couldn't get json from server.");
runOnUiThread (new Runnable () {
@ Override
public void run () {
Toast.makeText (getApplicationContext (),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show ();
}
});
}
return null;
}
}
package com.badjing.bloggercoba.activities;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.badjing.bloggercoba.R;
import com.badjing.bloggercoba.adapter.PostRecyclerViewAdapter;
import com.badjing.bloggercoba.config.Config;
import com.badjing.bloggercoba.handler.HttpHandler;
import com.badjing.bloggercoba.model.Posts;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private PostRecyclerViewAdapter postAdapter;
private ArrayList<Posts> postsArrayList;
private ProgressDialog pDialog;
private Config config = new Config();
String URL_FIX = Config.BLOG_URL + Config.BLOG_URL_MAX_RESULT + Config.MAX_RESULT + config.BLOG_URL_START_INDEX + config.START_INDEX + config.BLOG_URL_ALT_TYPE;;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
postsArrayList = new ArrayList<>();
new getContent().execute();
recyclerView = (RecyclerView) findViewById(R.id.post_recycle_view);
postAdapter = new PostRecyclerViewAdapter(postsArrayList);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(postAdapter);
}
// private void addData() {
//
// postsArrayList = new ArrayList<>();
// postsArrayList.add(new Posts("JUDUL", "SUMMARY"));
//
// }
private class getContent extends AsyncTask<Void, Void, Void> {
// @Override
// protected void onPreExecute() {
// super.onPreExecute();
// // Showing progress dialog
// pDialog = new ProgressDialog(MainActivity.this);
// pDialog.setMessage("Please wait...");
// pDialog.setCancelable(false);
// pDialog.show();
// }
@Override
protected Void doInBackground(Void... voids) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(URL_FIX);
if (jsonStr != null) {
try{
JSONObject jsonObj = new JSONObject(jsonStr);
JSONObject feed = jsonObj.getJSONObject("feed");
JSONArray entry = feed.getJSONArray("entry");
Posts postsModel = new Posts();
for (int i = 0; i < entry.length(); i++) {
postsModel.setTitle(entry.getJSONObject(i).getJSONObject("title").getString("$t"));
postsModel.setSummary(entry.getJSONObject(i).getJSONObject("summary").getString("$t"));
postsArrayList.add(postsModel);
}
} catch (final JSONException e) {
Log.e("RESPONSE", "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e("RESPONSE", "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
}
private void urlBuilder() {
URL_FIX = Config.BLOG_URL + Config.BLOG_URL_MAX_RESULT + 10 + config.BLOG_URL_START_INDEX + 1 + config.BLOG_URL_ALT_TYPE;
}
}
package com.badjing.bloggercoba.model;
public class Posts {
String title;
String summary;
public Posts() {
}
public Posts(String title, String summary) {
this.title = title;
this.summary = summary;
}
public String getTitle() {
return title;
}
public String getSummary() {
return summary;
}
public void setTitle(String title) {
this.title = title;
}
public void setSummary(String summary) {
this.summary = summary;
}
}
package com.badjing.bloggercoba.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.badjing.bloggercoba.R;
import com.badjing.bloggercoba.model.Posts;
import java.util.ArrayList;
public class PostRecyclerViewAdapter extends RecyclerView.Adapter<PostRecyclerViewAdapter.MyViewHolder> {
private ArrayList<Posts> postsList;
public PostRecyclerViewAdapter(ArrayList<Posts> postsArrayList) {
this.postsList = postsArrayList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.post_row_item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.blog_post_title.setText(postsList.get(position).getTitle());
holder.blog_post_sumary.setText(postsList.get(position).getSummary());
}
@Override
public int getItemCount() {
return (postsList!= null) ? postsList.size() : 0;
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView blog_post_title, blog_post_sumary, blog_post_author;
ImageView img_thumbnail;
public MyViewHolder(View itemView) {
super(itemView);
blog_post_title = itemView.findViewById(R.id.blog_post_title);
blog_post_sumary = itemView.findViewById(R.id.blog_post_sumary);
// blog_post_author = itemView.findViewById(R.id.blog_post_author);
// img_thumbnail = itemView.findViewById(R.id.post_thumbnail);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_marginTop="5dp"
android:padding="8dp"
android:background="#fff">
<ImageView
android:id="@+id/post_thumbnail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/loading_shape"></ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="230dp"
android:orientation="vertical"
android:layout_margin="8dp" >
<TextView
android:id="@+id/blog_post_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="blog post title"
android:textSize="20dp"
android:textStyle="bold"/>
<TextView
android:id="@+id/blog_post_sumary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="blog post summary"/>
<TextView
android:id="@+id/blog_post_author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="~ author"/>
</LinearLayout>
</LinearLayout>