You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据库的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:34:50