如何从数据库的JSON Array构建ListView?实现遇阻求助
解决从JSON Array构建ListView的问题
嘿,我懂你现在的困扰——从数据库拿到JSON Array后,不知道怎么把它转化成ListView能识别的列表对吧?我之前做项目时也踩过类似的坑,咱们一步步来搞定它!
第一步:把JSON Array解析成实体类列表
你已经定义了List<Publikasi> lstPublikasi,那首先要把数据库返回的JSON Array逐个解析成Publikasi对象,再放进这个列表里。假设你的JSON结构包含id、judul、penulis这类字段,代码可以这么写:
// 假设你已经从数据库获取到了jsonArray lstPublikasi = new ArrayList<>(); try { for (int i = 0; i < jsonArray.length(); i++) { JSONObject publikasiObj = jsonArray.getJSONObject(i); Publikasi publikasi = new Publikasi(); // 这里根据你的Publikasi类的字段来赋值,记得要对应JSON里的键名 publikasi.setId(publikasiObj.getInt("id")); publikasi.setJudul(publikasiObj.getString("judul")); publikasi.setPenulis(publikasiObj.getString("penulis")); // 其他字段同理,比如年份、期刊名之类的 lstPublikasi.add(publikasi); } } catch (JSONException e) { // 捕获JSON解析异常,避免崩溃,也可以在这里打日志排查问题 e.printStackTrace(); }
⚠️ 注意:一定要给Publikasi类写好对应的getter和setter方法,不然后面适配器拿不到数据哦!
第二步:创建自定义ArrayAdapter
默认的ArrayAdapter只能处理简单的文本,咱们需要自定义一个适配器来适配Publikasi对象,同时对应自己的列表项布局。
首先写适配器类:
public class PublikasiAdapter extends ArrayAdapter<Publikasi> { // 构造方法,传入上下文和数据列表 public PublikasiAdapter(Context context, List<Publikasi> publikasiList) { super(context, 0, publikasiList); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { // 获取当前位置的Publikasi对象 Publikasi currentPublikasi = getItem(position); // 复用convertView,提升ListView的性能,避免频繁创建View if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_publikasi, parent, false); } // 找到列表项布局里的控件 TextView tvJudul = convertView.findViewById(R.id.tv_judul); TextView tvPenulis = convertView.findViewById(R.id.tv_penulis); // 给控件设置数据 tvJudul.setText(currentPublikasi.getJudul()); tvPenulis.setText(currentPublikasi.getPenulis()); return convertView; } }
然后创建对应的列表项布局res/layout/item_publikasi.xml,可以根据你的需求调整样式:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_judul" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <TextView android:id="@+id/tv_penulis" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@android:color/darker_gray" android:layout_marginTop="4dp"/> </LinearLayout>
第三步:给ListView绑定适配器
回到你的ViewDosen活动里,在onCreate方法中初始化适配器并绑定到ListView上:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_dosen); // 初始化控件 tvWelcome = findViewById(R.id.tv_welcome); listView = findViewById(R.id.list_view); // 这里要确保你已经完成了JSON解析,lstPublikasi里有数据 PublikasiAdapter adapter = new PublikasiAdapter(this, lstPublikasi); listView.setAdapter(adapter); }
一些容易踩的坑
- 如果你的JSON是从网络或者异步任务获取的,一定要在主线程更新UI!比如用
runOnUiThread或者在AsyncTask的onPostExecute方法里解析数据并设置适配器。 - 检查你的
activity_view_dosen.xml里是否正确定义了ListView,并且id和代码里的list_view对应。 - 如果列表没有显示,先排查
lstPublikasi是否真的有数据,可以打Log或者用Toast输出列表长度确认。
内容的提问来源于stack exchange,提问作者quentino97
相关产品推荐
相关产品推荐

