簡體   English   中英

adapter.notifyDataSetChanged()無法正常工作,錯誤在哪里?

[英]adapter.notifyDataSetChanged() doesn't work correctly, where is the error?

我無法從鏈接中添加成功提取的數據。 我不知道錯誤在哪里,也許變量“列表”在哪里,但實際上我不知道為什么應用程序不想啟動。 每當涉及到“ adapter.notifyDataSetChanged();”時,應用程序就會崩潰。

我知道此頁面: Adapter.NotifyDataSetChanged不起作用 ,但對我不起作用。

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; }

嘗試這個,

@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();
    }
}

代替list.add(new Adapter(result)); 將新項目添加到adapter內部的列表,即user 那就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM