嗯,这是可能的。
覆盖 ArrayAdapter 的 getView 和 add 方法
例如,我做了什么作为测试用例:
public class custom_row extends ArrayAdapter<String> {
String newItem = "";
Boolean doRefresh = true;
public custom_row(Context context, int resource, ArrayList<String> objects) {
super(context, resource, objects);
}
public custom_row(Context context, int resource, String[] objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String itemValue = getItem(position);
if (doRefresh == false && itemValue != newItem) {
return convertView;
}
LayoutInflater inflater = LayoutInflater.from(getContext());
View customView = inflater.inflate(R.layout.customr_row, parent, false);
ImageView myImageView = (ImageView) customView.findViewById(R.id.imageView);
String url = "https://urltoimage/image.jpg";
(new DownloadImageTask(myImageView)).execute(url);
TextView myTextView = (TextView) customView.findViewById(R.id.myCustomText);
myTextView.setText(itemValue);
return customView;
}
public void addNewItemToList(String item) {
this.newItem = item;
this.doRefresh = false;
add(item);
}
private class DownloadImageTask extends AsyncTask<String, Integer, Bitmap>{
private ImageView mImageView;
public DownloadImageTask(ImageView imageView) {
this.mImageView = imageView;
}
@Override
protected Bitmap doInBackground(String... params) {
URL url = null;
Bitmap bmp = null;
try {
url = new URL(params[0]);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
InputStream stream = url.openStream();
bmp = BitmapFactory.decodeStream(stream);
} catch (IOException e) {
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap bmp) {
this.mImageView.setImageBitmap(bmp);
}
}
}
第一次加载所有项目,图像由异步线程动态加载。getView 方法中的以下代码部分可防止列表完全刷新,从而防止图像闪烁:
String itemValue = getItem(position);
if (doRefresh == false && itemValue != newItem) {
return convertView;
}
当新项目添加到列表中时,ArrayAdapter 将再次遍历列表。只需检查当前位置的项目是否是新添加的项目。如果不是,则返回作为旧视图的 convertView,否则加载项目并返回自定义视图。