我创建了一个HTTPManager类,使GET请求从http://dev1.digitalnativeshq.com/userJSONtest.json下载一个简单的JSON文件
在ASyncTask中,发出GET请求并返回一个字符串。该字符串由JSONParser类解析。 JSONParser返回一个User对象数组。在onPostExecute中,我想将适配器数据设置为在doInBackGround中下载和解析的信息。我尝试时收到错误 adapter = new ContactAdapter(MainActivity.this,contactList);
MainActivity.java
public class MainActivity extends Activity {
private ContactAdapter adapter;
private static String testURL = "http://dev1.digitalnativeshq.com/userJSONtest.json";
private RecyclerView rView;
private List<ContactInfo> contactList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rView = (RecyclerView)findViewById(R.id.list);
rView.setHasFixedSize(true);
LinearLayoutManager layout = new LinearLayoutManager(this);
layout.setOrientation(LinearLayoutManager.VERTICAL);
rView.setLayoutManager(layout);
fillRecyclerview task = new fillRecyclerview();
task.execute();
}
private class fillRecyclerview extends AsyncTask<Void, Void, List<ContactInfo>>{
@Override
protected List<ContactInfo> doInBackground(Void... params) {
String json = HTTPManager.getData(testURL);
contactList = JSONParser.parseFeed(json);
return contactList;
}
@Override
protected void onPostExecute(List<ContactInfo> result){
adapter = new ContactAdapter(MainActivity.this, contactList);
rView.setAdapter(adapter);
}
}
JSONParser.java
public class JSONParser {
public static List<ContactInfo> parseFeed(String content){
try {
JSONArray ar = new JSONArray(content);
List<ContactInfo> userList = new ArrayList<>();
//iterate through JSON object and set fields to strings
for (int i = 0; i < ar.length(); i++) {
JSONObject obj = ar.getJSONObject(i);
ContactInfo user = new ContactInfo();
user.setName(obj.getString("name"));
user.setEmail(obj.getString("email"));
userList.add(user);
}
return userList;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
ContactAdapter.java
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
private List<ContactInfo> contactList;
public ContactAdapter(List<ContactInfo> contactList) {
this.contactList = contactList;
}
@Override
public int getItemCount() {
return contactList.size();
}
public static class ContactViewHolder extends RecyclerView.ViewHolder {
protected TextView vName;
protected TextView vEmail;
public ContactViewHolder(View v) {
super(v);
vName = (TextView) v.findViewById(R.id.name);
vEmail = (TextView) v.findViewById(R.id.email);
}
}
@Override
public void onBindViewHolder(ContactViewHolder contactViewHolder, int i) {
ContactInfo ci = contactList.get(i);
contactViewHolder.vName.setText(ci.name);
contactViewHolder.vEmail.setText(ci.email);
}
//select XML layout for each card
@Override
public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.cardview, viewGroup, false);
return new ContactViewHolder(itemView);
}
}
HTTPManager.java
public class HTTPManager {
public static String getData(String uri){
BufferedReader reader = null;
try{
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = reader.readLine()) != null){
sb.append(line + "\n");
}
return sb.toString();
} catch (Exception e){
e.printStackTrace();
return null;
} finally {
if (reader == null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:0)
在您的MainActivity.java中,您获得名为List<ContactInfo>
的{{1}}。但是在使用result
时,您正在使用doInBackground中的adapter
。
contactList
不知道是否会解决这个问题,但你试过这个吗?
@Override
protected void onPostExecute(List<ContactInfo> result){
adapter = new ContactAdapter(MainActivity.this, contactList);
rView.setAdapter(adapter);
}