2016-10-22 4 views
0

リンクから正常に抽出されたデータを追加できません。 私はどこにエラーがあるのか​​分かりませんが、おそらく変数 'list'ですが、実際にアプリケーションが開始したくない理由がわかりません。 "adapter.notifyDataSetChanged();"になるたびにアプリケーションがクラッシュします。adapter.notifyDataSetChanged()が正しく動作しません。エラーはどこですか?

私はこのページを知っています:Adapter.NotifyDataSetChanged doesn't workしかし、私のために働いていません。

MainActivity.java:

public class RecyclerViewActivity extends AppCompatActivity { 
Adapter adapter; 
private LinearLayoutManager llm; 
private static List<Mymodel> ddd; 
final String URL = "url";//this url contains an array: {"user":[{"message":"hi","from":"earth"}]} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main_activity); 

    recycler = (RecyclerView)findViewById(R.id.recyclerview); 

    linearlm = new LinearLayoutManager(this); 
    recycler.setLayoutManager(llm); 
    recycler.setHasFixedSize(true); 

    //this list is empty, i want only start the adapter 
    List<Mymodel> list= new ArrayList<>(); 
    adapter = new Adapter(list); 
    recycler.setAdapter(adapter); 

    new myfunction().execute(URL); 
    } 
public class myfunctionextends AsyncTask<String, String, List<Mymodel>> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected List<Mymodel> doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

      String finalJson = buffer.toString(); 

      JSONObject parentObject = new JSONObject(finalJson); 
      JSONArray parentArray = parentObject.getJSONArray("user"); 


      List<Mymodel> modelist = new ArrayList<>(); 

      Gson gson = new Gson(); 
      for (int i = 0; i < parentArray.length(); i++) { 
       JSONObject finalObject = parentArray.getJSONObject(i); 
       Mymodel mymodel= gson.fromJson(finalObject.toString(), Mymodel.class); 
       modelist .add(mymodel); 
      } 

      return modelist ; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(final List<Mymodel> result) { 
     super.onPostExecute(result); 
     if (result != null) { 
      list.add(new Adapter(result)); 
      adapter.notifyDataSetChanged(); 
     }else{ 
      Toast.makeText(getApplicationContext(), "manca internet", Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

Adapter.java:

public class Adapter extends RecyclerView.Adapter<RVAdapter.ViewHolder> { 
public static class ViewHold erextends RecyclerView.ViewHolder { 

    TextView message; 
    TextView from; 

    ViewHolder(View itemView) { 
     super(itemView); 
     message = (TextView)itemView.findViewById(R.id.message); 
     from = (TextView)itemView.findViewById(R.id.from); 
    } 
} 

List<Mymodel> user; 

Adapter(List<Mymodel> user){ 
    this.user= user; 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); 
    ViewHolder pvh = new ViewHolder(v); 
    return pvh; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    viewHolder.message.setText(user.get(i).getMessage()); 
    iewHolder.from.setText(user.get(i).getFrom()); 
} 

@Override 
public int getItemCount() { 
    return user.size(); 
} 
} 

Mymodel.java:

public String from; 
public String message; 

public String getMessage() { return message; } 

public String getFrom() { return from; } 

答えて

1

@Override 
protected void onPostExecute(final List<Mymodel> result) {   
    if (result != null) { 
     // remove existing elements to prevent duplicates 
     list.clear(); 
     // update dataset 
     list.addAll(result); 
     // notify the adapter 
     adapter.notifyDataSetChanged(); 
    } else { 
     Toast.makeText(getApplicationContext(), "manca internet", Toast.LENGTH_SHORT).show(); 
    } 
} 
、これを試してみてください
0

代わりのlist.add(new Adapter(result));adapter内部リストに新しい項目を追加userすなわち。それはその後動作します。

関連する問題