package com.idormy.sms.forwarder.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.idormy.sms.forwarder.R; import com.idormy.sms.forwarder.model.RuleModel; import com.idormy.sms.forwarder.model.SenderModel; import com.idormy.sms.forwarder.sender.SenderUtil; import java.util.List; public class RuleAdapter extends ArrayAdapter { private final int resourceId; private List list; // 适配器的构造函数,把要适配的数据传入这里 public RuleAdapter(Context context, int textViewResourceId, List objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; list = objects; } @Override public int getCount() { return list.size(); } @Override public RuleModel getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { RuleModel item = list.get(position); if (item == null) { return 0; } return item.getId(); } // convertView 参数用于将之前加载好的布局进行缓存 @Override public View getView(int position, View convertView, ViewGroup parent) { RuleModel ruleModel = getItem(position); //获取当前项的TLog实例 // 加个判断,以免ListView每次滚动时都要重新加载布局,以提高运行效率 View view; ViewHolder viewHolder; if (convertView == null) { // 避免ListView每次滚动时都要重新加载布局,以提高运行效率 view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); // 避免每次调用getView()时都要重新获取控件实例 viewHolder = new ViewHolder(); viewHolder.ruleMatch = view.findViewById(R.id.rule_match); viewHolder.ruleSender = view.findViewById(R.id.rule_sender); viewHolder.ruleImage = view.findViewById(R.id.rule_image); viewHolder.ruleStatus = view.findViewById(R.id.rule_status); viewHolder.ruleSenderImage = view.findViewById(R.id.rule_sender_image); viewHolder.ruleSenderStatus = view.findViewById(R.id.rule_sender_status); // 将ViewHolder存储在View中(即将控件的实例存储在其中) view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } // 获取控件实例,并调用set...方法使其显示出来 if (ruleModel != null) { viewHolder.ruleImage.setImageResource(ruleModel.getImageId()); viewHolder.ruleStatus.setImageResource(ruleModel.getStatusImageId()); List senderModel = SenderUtil.getSender(ruleModel.getSenderId(), null); viewHolder.ruleMatch.setText(ruleModel.getRuleMatch()); if (!senderModel.isEmpty()) { viewHolder.ruleSender.setText(senderModel.get(0).getName()); viewHolder.ruleSenderImage.setImageResource(senderModel.get(0).getImageId()); viewHolder.ruleSenderStatus.setImageResource(senderModel.get(0).getStatusImageId()); } else { viewHolder.ruleSender.setText(""); } } return view; } public void add(List ruleModels) { if (list != null) { list = ruleModels; notifyDataSetChanged(); } } public void del(List ruleModels) { if (list != null) { list = ruleModels; notifyDataSetChanged(); } } public void update(List ruleModels) { if (list != null) { list = ruleModels; notifyDataSetChanged(); } } // 定义一个内部类,用于对控件的实例进行缓存 static class ViewHolder { TextView ruleMatch; TextView ruleSender; ImageView ruleImage; ImageView ruleStatus; ImageView ruleSenderImage; ImageView ruleSenderStatus; } }