如何在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
相关产品推荐
相关产品推荐

