【问题标题】:RecyclerView Loading Data Delay for Passing Json Data On ArrayList to New Activity将 ArrayList 上的 Json 数据传递给新活动的 RecyclerView 加载数据延迟
【发布时间】:2019-06-08 21:33:28
【问题描述】:

我正在使用 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();
   }

我会尝试使用它,但不工作:(

MainActivity

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

}

MAinActivity 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 但是当使用返回按钮并再次单击传递数据按钮时显示数据

【问题讨论】:

    标签: java android json


    【解决方案1】:

    在您的 MainActivity2 中,第一次调用 setrecyclerview() 时 mainList 为空。

    如下更改您的 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;
        }
    

    【讨论】:

      【解决方案2】:

      替换这个...

      if (!setrecyclerview(mainList) ) {
             pr.show();
         } else {
             mainList = gson.fromJson(getIntent().getStringExtra("key"), new TypeToken<List<MyData>>(){}.getType());
             setrecyclerview(mainList);
         }
      

      与...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多