【问题标题】:Pass json data using Gson and display RecyclerView but still display only last record in android使用 Gson 传递 json 数据并显示 RecyclerView 但仍仅显示 android 中的最后一条记录
【发布时间】:2016-12-18 17:16:43
【问题描述】:

我已经创建了简单的 json 数据传递用户的名字和姓氏,但我只显示了一条记录,但是这次我已经将意图放入 for 循环中创建多个活动,而以上 for 循环放置意图这次只显示一个创建。 并且列表大小是数据库表值大小。
像这样

名字姓氏

Android corejava

Android corejava

Android corejava

Android corejava


**我的 Json 活动 **

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fn = (EditText) findViewById(R.id.fn);
    ln = (EditText) findViewById(R.id.ln);
    insert = (Button) findViewById(R.id.insert1);
    show = (Button) findViewById(R.id.button2);

    requestQueue = Volley.newRequestQueue(getApplicationContext());

    show.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            class GetDataJSON extends AsyncTask<String, Void, String> {

                @Override
                protected String doInBackground(String... params) {

                    DefaultHttpClient httpclient = new DefaultHttpClient(
                            new BasicHttpParams());

                    HttpPost httppost = new HttpPost(
                            "http://192.168.2.5/Demo/lgin.php");

                    httppost.setHeader("Content-type", "application/json");
                    InputStream inputStream = null;
                    String result = null;
                    try {
                        HttpResponse response = httpclient
                                .execute(httppost);
                        HttpEntity entity = response.getEntity();
                        inputStream = entity.getContent();

                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(inputStream, "UTF-8"),
                                8);

                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        result = sb.toString();

                    } catch (Exception e) {
                    } finally {
                        try {
                            if (inputStream != null)
                                inputStream.close();
                        } catch (Exception squish) {

                        }
                    }
                    return result;
                }

                @Override
                protected void onPostExecute(String result) { 
                    JSONObject jsonObj = null;
                    JSONArray jArray = null;
                    ArrayList<Model> data = new ArrayList<>();
                    try {
                        jsonObj = new JSONObject(result);
                        jArray = jsonObj.getJSONArray("userdetail");

                        Model model = new Model();

                        for (int i = 0; i < jArray.length(); i++) {

                            JSONObject jObject = null;
                            jObject = jArray.getJSONObject(i);


                            model.setName(jObject.getString("user"));
                            model.setLastname(jObject.getString("pass"));


                            Log.d(getClass().getName(), "User = " + model.getName() + "Pas = " + model.getLastname());

                            data.add(model);

                        }
                        Intent intent = new Intent(getApplicationContext(), ViewData.class);
                        intent.putExtra("data",new Gson().toJson(data));
                        startActivity(intent);

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }
            GetDataJSON g = new GetDataJSON();
            g.execute();

        }
    });


    insert.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            // TODO Auto-generated method stub
            StringRequest request = new StringRequest(Request.Method.POST, insertURl, new Response.Listener<String>() {

                @Override
                public void onResponse(String arg0) {
                    // TODO Auto-generated method stub

                }

            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    // TODO Auto-generated method stub

                }
            }) {
                @Override
                protected Map<String, String> getParams()
                        throws AuthFailureError {
                    // TODO Auto-generated method stub
                    Map<String, String> parameters = new HashMap<String, String>();
                    parameters.put("user", fn.getText().toString());
                    parameters.put("pass", ln.getText().toString());
                    Log.d(getClass().getName(), "View =" + fn.getText().toString() + "LastNAme = " + ln.getText().toString());
                    return parameters;

                }
            };
            requestQueue.add(request);
        }
    });

}

我的 Recyclerview 课程

public class ViewData extends Activity {
private AdapterFish mAdapter;
private List<Model> list;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.container_fish);

    String dataString = getIntent().getStringExtra("data");
    ArrayList<Model> list = new Gson().fromJson(dataString, new TypeToken<ArrayList<Model>>() {
    }.getType());
    mAdapter = new AdapterFish(ViewData.this, (ArrayList<Model>) list);
    RecyclerView mRVFishPrice = (RecyclerView) findViewById(R.id.fishPriceList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    mRVFishPrice.setLayoutManager(mLayoutManager);
    mRVFishPrice.setAdapter(mAdapter);
}

适配器

public class AdapterFish extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private Context context;
private LayoutInflater inflater;
ArrayList<Model> data;
Model current;
int currentPos = 0;

// create constructor to innitilize context and data sent from MainActivity
public AdapterFish(Context context, ArrayList<Model> data) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.customlayout, parent, false);
    MyHolder holder = new MyHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder myHolder = (MyHolder) holder;
    Model model = data.get(position);
    myHolder.tvFirstName.setText(model.getName());
    myHolder.tvLastName.setText(model.getLastname());
}

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

class MyHolder extends RecyclerView.ViewHolder {

    TextView tvFirstName;
    TextView tvLastName;


    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        tvFirstName = (TextView) itemView.findViewById(R.id.tvFirstName);
        tvLastName = (TextView) itemView.findViewById(R.id.tvLastName);
    }

}

}

【问题讨论】:

  • 发布你的 Recycler View 适配器类,它持有你的 onBindViewHolder() 方法。
  • 添加我的 Adapterclass@SaurabhBhandari
  • 不要使用 View 作为 'List' 的对象给另一个名字或使用 view 代替 View
  • 您使用的是 Volley 和 apache http?我建议只使用一个库来进行网络请求。 Volley 不需要 AsyncTask
  • 我有使用列表查看但没有解决@SaurabhBhandari

标签: android json android-recyclerview


【解决方案1】:

使用 Gson 将您的 Array List 转换为 String,然后将其传递给 Intent。

    Intent intent = new Intent(getApplicationContext(), ViewData.class);
    intent.putExtra("data",new Gson().toJson(data));
    startActivity(intent)

将字符串转回列表

    String dataString = getIntent().getStringExtra("data") ;
    ArrayList<Model> list = new Gson().fromJson(dataString ,new TypeToken<ArrayList<Model>>(){}.getType());

在 Gradle 中

    compile 'com.google.code.gson:gson:2.7'

【讨论】:

  • 我已经把这段代码放在了 com.example.post.AdapterFish.getItemCount 的 java.lang.NullPointerException 如何解决它@Saurabh Padwekar
  • 这个方法数据是显示的,但只显示数据库中的最后一个数据这个错误如何解决?@Saurabh Padwekar
  • java.lang.NullPointerException error issolved but this method data is display but only display last data in database this error如何解决?
  • 检查列表大小是否包含所有数据。
  • 检查你的适配器,getItemCount 应该是 list.size()
【解决方案2】:

如果您在 Log Cat 中获取数据,请使用以下方法传递您的 ArrayList。

Intent intent = new Intent(YourCurrentActivity.this, ViewData.class);
        intent.putStringArrayListExtra("data", data);
        startActivity(intent);

在你的 ViewData Activity 中你需要做的事情

ArrayList<Model> list = new ArrayList<>();
 list = getIntent().getStringArrayListExtra("data");

通过列表 ti 你的 RecyclerView 适配器类

mAdapter = new AdapterFish(ViewData.this, (ArrayList<Model>) list);

【讨论】:

  • 不可能,你试试这个吗?在我的情况下,我使用模型类发送数据,所以我没有使用 putStringArrayListExtra
【解决方案3】:

试试这个:

 Model model ;

                        for (int i = 0; i < jArray.length(); i++) {
                            model = new Model();
                            JSONObject jObject = null;
                            jObject = jArray.getJSONObject(i);


                            model.setName(jObject.getString("user"));
                            model.setLastname(jObject.getString("pass"));


                            Log.d(getClass().getName(), "User = " + model.getName() + "Pas = " + model.getLastname());

                            data.add(model);

                        }

 Gson gson = new Gson();
                data = gson.fromJson(response.toString(), new TypeToken<ArrayList<Model>>() {
                }.getType());

【讨论】:

  • 我已经在我的代码中添加了这个,请检查我的 qu?@Avinash kumawat
  • 您的代码没有问题,只是在您的 Json 活动中进行了一个小修复,在您的 for 循环中而不是在循环之外初始化您的模型类。你能分享一下custom_layout.xml吗?
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多