使用已解析的JSON填充RecyclerView。 onPostExecute错误

时间:2015-03-19 17:42:45

标签: android-recyclerview android-cardview

我创建了一个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();
            }
        }
    }


}
}

1 个答案:

答案 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);
    }