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

如何在Fragment的ListView中自定义Adapter实现CardView双字段展示

实现自定义Adapter在Fragment的ListView中用CardView展示nama_matkul和sks字段

你现在已经搞定了数据库连接和JSON解析,就差最后一步自定义Adapter来适配CardView展示两个字段了,我来帮你调整代码,完美适配你的需求:

第一步:编写自定义Adapter(适配你的Matkul_Mhs实体类)

你之前找到的示例用了HashMap,其实更适合你的是直接用已经存在的Matkul_Mhs类做泛型,代码更清晰,也不用额外转HashMap。另外要注意复用convertView来提升ListView的性能,不要每次都重新加载布局:

public class MatkulAdapter extends ArrayAdapter<Matkul_Mhs> {
    // 存放课程数据的列表
    private List<Matkul_Mhs> matkulList;
    private Context context;
    // CardView布局的资源ID
    private int resource;

    // ViewHolder用于复用视图,避免重复执行findViewById
    static class ViewHolder {
        TextView tvMatkul;
        TextView tvSks;
    }

    public MatkulAdapter(Context context, int resource, List<Matkul_Mhs> objects) {
        super(context, resource, objects);
        this.context = context;
        this.resource = resource;
        this.matkulList = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            // 第一次加载时初始化布局和ViewHolder
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(resource, parent, false);
            holder = new ViewHolder();
            holder.tvMatkul = convertView.findViewById(R.id.tv_matkul);
            holder.tvSks = convertView.findViewById(R.id.tv_sks);
            // 将ViewHolder绑定到convertView,方便后续复用
            convertView.setTag(holder);
        } else {
            // 复用已有的视图,直接取出ViewHolder
            holder = (ViewHolder) convertView.getTag();
        }

        // 获取当前位置的课程数据
        Matkul_Mhs matkul = matkulList.get(position);
        // 给TextView设置对应字段内容
        holder.tvMatkul.setText(matkul.getNamaMatkul());
        // 把数字类型的sks转成字符串,加上后缀
        holder.tvSks.setText(String.valueOf(matkul.getSks()) + " sks");

        return convertView;
    }
}

第二步:修改Fragment中的initListView1方法

原来的代码你只提取了nama_matkul数组,现在直接把整个List<Matkul_Mhs>传给自定义Adapter就行,不用再单独处理数组了:

public void initListView1(){
    Call<MatkulMhs> getMatkulMhs = mApiService.getMatkulMhs(mPrefs.getUserID());
    getMatkulMhs.enqueue(new Callback<MatkulMhs>() {
        @Override
        public void onResponse(Call<MatkulMhs> call, Response<MatkulMhs> response) {
            boolean iserror_ = response.body().getError();
            if (!iserror_) {
                List<Matkul_Mhs> list = response.body().getMatkulMhs();
                // 替换原来的ArrayAdapter为自定义的MatkulAdapter
                MatkulAdapter adapter = new MatkulAdapter(getActivity(), R.layout.form_mhs_02_cardview, list);
                listview1.setAdapter(adapter);
            }
        }

        // 别忘了处理请求失败的情况,给用户反馈
        @Override
        public void onFailure(Call<MatkulMhs> call, Throwable t) {
            Toast.makeText(getActivity(), "加载课程数据失败,请稍后重试", Toast.LENGTH_SHORT).show();
        }
    });
}

几个关键注意点:

  • 确保你的Matkul_Mhs实体类里有正确的getNamaMatkul()和getSks()方法,能正确读取JSON解析后的字段值。
  • 用Matkul_Mhs作为Adapter泛型比HashMap更贴合你的业务逻辑,后续维护起来更方便。
  • 复用convertView和ViewHolder是ListView的基础优化手段,能避免频繁创建视图和查找控件,提升滚动流畅度。

内容的提问来源于stack exchange,提问作者Togan J.R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:10