java - RecyclerView 加载数据延迟以将 ArrayList 上的 Json 数据传递给新 Activity

标签 java android json

我正在使用 Button 将带有 ArrayList 的 JSON 数据传递到 RecyclerView 上的另一个 Activity,但是当我第一次运行我的应用程序时,RecyclerView 显示空列表,按下后退按钮并再次单击该按钮后,RecyclerView 显示我的列表,我不知道我的代码出了什么问题,请帮助我

    mainList = gson.fromJson(getIntent().getStringExtra("key"), new         TypeToken<List<MyData>>(){}.getType());

   if (mainList != null) {

       setrecyclerview(mainList);

   } else {
      pr.show();
   }

我会尝试使用这个,但不起作用:(

主要 Activity

public class MainActivity extends AppCompatActivity {
private List<MyData> data_list;
private RequestQueue requestQueue;
String get_info_url = "http://192.168.170.2/iVolleyPractice/user_info_check.php";

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

    //recyclerView = (RecyclerView) findViewById(R.id.data_recycler);
    data_list = new ArrayList<>();
    //load_from_data();



}

public void GoOnClick(View view) {

    load_from_data();

    Gson gson = new Gson();
    String json = new Gson().toJson(data_list);
    Intent intent = new Intent(MainActivity.this, Main2Activity.class);
    intent.putExtra("key", json);
    startActivity(intent);



}

private void load_from_data() {

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, get_info_url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {

                JSONArray jsonArray = response.getJSONArray("users");

                for (int i = 0 ; i < jsonArray.length() ; i++)
                {
                    JSONObject users = jsonArray.getJSONObject(i);
                    MyData myData = new MyData();

                    myData.setName(users.getString("name"));
                    myData.setPassword(users.getString("password"));

                    data_list.add(myData);

                }



            } catch (Exception e) {}



        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    //setrecyclerview(data_list);
    requestQueue = Volley.newRequestQueue(MainActivity.this);
    requestQueue.add(jsonObjectRequest);

}

主要 Activity 2

public class Main2Activity extends AppCompatActivity {

public RecyclerView recyclerView;
public List<MyData> mainList;

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

    recyclerView = (RecyclerView) findViewById(R.id.go_recycle);
    Gson gson = new Gson();

    ProgressDialog pr = new ProgressDialog(this);
    this.getIntent().getExtras().getParcelableArrayList("key");


    ProgressDialog pr = new ProgressDialog(this);
    this.getIntent().getExtras().getParcelableArrayList("key");
    mainList = gson.fromJson(getIntent().getStringExtra("key"), new TypeToken<List<MyData>>(){}.getType());
    setrecyclerview(mainList);


}


private boolean setrecyclerview(List<MyData> data_list) {

    CustomAdapter adapter = new CustomAdapter(this, data_list);
    DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), new LinearLayoutManager(this).getOrientation());
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.addItemDecoration(divider);
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);
    return true;
}

}

适配器

class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

private Context context;
private List<MyData> myData;

public CustomAdapter(Context context, List<MyData> myData) {
    this.context = context;
    this.myData = myData;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_inflater, parent, false);

    return new ViewHolder(itemView);

}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    holder.name.setText(myData.get(position).getName());
    holder.pass.setText(myData.get(position).getPassword());

}

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


public class ViewHolder extends RecyclerView.ViewHolder {

    TextView name,pass;


    public ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.name_txt);
        pass = (TextView) itemView.findViewById(R.id.pass_txt);
    }
}

我的数据

 public class MyData implements Parcelable {

private String name,password;

public MyData() {
    this.name = name;
    this.password = password;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

protected MyData(Parcel in) {
    name = in.readString();
    password = in.readString();
}

public static final Creator<MyData> CREATOR = new Creator<MyData>() {
    @Override
    public MyData createFromParcel(Parcel in) {
        return new MyData(in);
    }

    @Override
    public MyData[] newArray(int size) {
        return new MyData[size];
    }
};



@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeString(password);
}

我想当在MainActivity中单击我的按钮时在MainActivity2的RecyclerView中显示MyData,但第一次运行我的应用程序时显示空的Recycler,但当使用后按按钮并单击传递数据按钮时再次显示数据

最佳答案

在 MainActivity2 中,第一次调用 set recyclerview() 时,主列表为空。

更改您的 mainActivity2 代码如下:

  public RecyclerView recyclerView;
    public List<MyData> mainList;

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

        recyclerView = (RecyclerView) findViewById(R.id.go_recycle);
        Gson gson = new Gson();

        ProgressDialog pr = new ProgressDialog(this);
        this.getIntent().getExtras().getParcelableArrayList("key");


        mainList = gson.fromJson(getIntent().getStringExtra("key"), new TypeToken<List<MyData>>(){}.getType());
       if (!setrecyclerview(mainList) ) {
         //I don't know why you are doing this.because setrecyclerview() always returns true
           pr.show();
       } else {
           setrecyclerview(mainList);
       }


    }


    private boolean setrecyclerview(List<MyData> data_list) {

        CustomAdapter adapter = new CustomAdapter(this, data_list);
        DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), new LinearLayoutManager(this).getOrientation());
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.addItemDecoration(divider);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(adapter);
        return true;
    }

关于java - RecyclerView 加载数据延迟以将 ArrayList 上的 Json 数据传递给新 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505961/

相关文章:

android - 键盘出现时如何使android View 可滚动?

javascript - 如何使用 id/name 从 json 存储中查找特定条目

java - 将字段解析为对象或数组时出错

java - try catch block 中预期的标识符

java - 如何对编号的行进行排序? java

java - 如何使 Spring Shell 命令失败?

java - 日期格式中月和日的固定长度?

java - 小数点后无法仅显示 1 位或空位

android - Phonegap 电话 : uri not working on android even after whitelisting

java - 使用自定义 jackson 序列化器替换Enum值