java - 循环 JsonArray 成功,但没有显示任何内容
问题描述
我是 Android Studio 的新手。我想制作一个仅显示当前用户名的 RecyclerView。示例:我使用我的用户名“rzyd”登录,我想从数据库中显示我的笔记。我有白色显示,但它说成功。我的 logcat 显示:“E/RecyclerView:未连接适配器;跳过布局”。有人能帮我吗?
这是我的代码:
Catatan.java
public class Catatan extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listItems;
Dialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catatan);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
listItems = new ArrayList<>();
dialog = new Dialog(this);
loadRecyclerViewData();
}
public void loadRecyclerViewData(){
final String url = "http://xxxxxxxxx.xxxxxxxxxx.com/tampilcatatan.php";
dialog.setContentView(R.layout.cobaloding);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
Intent intent = getIntent();
final String usernamenya = intent.getStringExtra("usernamev2");
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
try {
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
dialog.hide();
JSONObject jsonObject = new JSONObject(s);
String status = jsonObject.getString("status");
if(status.equals("sukses")){
Intent intent = getIntent();
String usernamenya = intent.getStringExtra("usernamev2");
Toast.makeText(getApplicationContext(), "Sukses, your username: " + usernamenya, Toast.LENGTH_LONG).show();
JSONArray array = jsonObject.getJSONArray("semua");
for (int i = 0; i < array.length(); i++) {
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("judul"),
o.getString("catatan")
);
listItems.add(item);
}
} else {
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
dialog.hide();
Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_LONG).show();
}
LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(manager);
recyclerView.setHasFixedSize(true);
adapter = new CatatanAdapter(listItems, getApplicationContext());
recyclerView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
dialog.setContentView(R.layout.popup_koneksigagal);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
error.printStackTrace();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
Intent intent = getIntent();
String usernamenya = intent.getStringExtra("usernamev2");
params.put("username", usernamenya.trim());
return params;
}
};
Volley.newRequestQueue(this).add(stringRequest);
}
}
我的适配器:
public class CatatanAdapter extends
RecyclerView.Adapter<CatatanAdapter.ViewHolder> {
private List<ListItem> listItems;
private Context context;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(v);
}
public CatatanAdapter(List<ListItem> listItems, Context context) {
this.listItems = listItems;
this.context = context;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ListItem listItem = listItems.get(position);
holder.textViewJudulnya.setText(listItem.getJudulnya());
holder.textViewCatatannya.setText(listItem.getCatatannya());
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textViewJudulnya;
public TextView textViewCatatannya;
public ViewHolder(View itemView) {
super(itemView);
textViewJudulnya = itemView.findViewById(R.id.judulnya);
textViewCatatannya = itemView.findViewById(R.id.catatannya);
}
}
}
我的php脚本:
<?php
error_reporting(0);
$conn = mysqli_connect("localhost", "id6487272_kuch", "xxxxxxxxx", "id6487272_bowo_db");
$username = $_POST['username'];
$mysqli = "SELECT * FROM catatan WHERE username='$username'";
$result = mysqli_query($conn, $mysqli) or die('error: ' .mysql_error());
$rows = array();
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$rows[] = $row;
}
if (mysqli_num_rows($result) >= 1) {
echo json_encode(Array('status' => 'sukses'));
echo '{"semua":'.json_encode($rows).'}';
} else {
echo json_encode(Array('status' => 'gagal'));
}
?>
我的手机截图:
解决方案
您可以将所有这些移到 onCreate 中。它不应该被复制到 Volley 响应中
LinearLayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
recyclerView.setHasFixedSize(true);
adapter = new CatatanAdapter(listItems, this);
recyclerView.setAdapter(adapter);
然后,您需要验证您实际上是否获得了任何 JSON 值。仅仅因为你得到一个 Toast 并不意味着你正在循环任何东西
例如,您很可能在 logcat 中得到 ParseExceptiom,因为您回显了两个单独的 JSON 对象而不是一个。
你需要这个
if (mysqli_num_rows($result) >= 1) {
echo json_encode(Array('status' => 'sukses', 'semua' => $rows));
}
我建议在使用 RecyclerView 之前先尝试打印出 logcat 中的单个 JSON 元素
推荐阅读
- r - 调用具有可变数量参数的函数
- javascript - 最近的 Blogspot 更新中断了 web 扩展的 window.getSelection()。有什么建议的解决方法吗?
- authentication - 托管在专用网络中并使用 Azure AD 作为 oauth 提供程序时,Keycloak 引发 UnknownHostException
- python - 熊猫的相关代码在哪里?
- firebase - 如何为来自另一个firebase项目的用户设置/传播firebase身份验证上下文(UID)以进行firestore规则配置?
- amazon-web-services - 是否可以在特定时间范围内对 S3 事件进行分组?
- python - 熊猫仅在数据框中获取包含另一列中某个字符串的行的最小/最大值
- spring - spring boot如何使用jpa查询将项目附加到列表中
- android - Android 10+ 电话录音支持
- powershell - New-DFSNFolderTarget cmdlet 的问题