使用 ArrayAdapter 在 StickyListHeadersListView 中显示 ImageView
Display ImageView in StickyListHeadersListView using an ArrayAdapter
我正在实施 StickyListHeadersListView
以显示联系信息。我正在使用实现 StickyListHeadersAdapter
的 ArrayAdapter<Contact>
。工作正常,每个项目显示一个图像和一个字符串,问题是图像在滚动时交换,我不确定为什么
列表视图:
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:id="@+id/contact_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.01"
android:background="#FFFFFF">
</se.emilsjolander.stickylistheaders.StickyListHeadersListView>
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.contact_row, null, false);
convertView.setTag(R.id.chk_selected, convertView.findViewById(R.id.chk_selected));
convertView.setTag(R.id.contact_avatar, convertView.findViewById(R.id.contact_avatar));
convertView.setTag(R.id.contact_name, convertView.findViewById(R.id.contact_name));
convertView.setTag(R.id.contact_info, convertView.findViewById(R.id.contact_info));
convertView.setBackgroundColor(Color.WHITE);
}
fill((ViewGroup) convertView, getItem(position));
return convertView;
}
private void fill(ViewGroup rl, Contact contact) {
boolean state = itemChecked.get(contact.getId()) != null ? itemChecked.get(contact.getId()): false;
((CheckBox) rl.getTag(R.id.chk_selected)).setChecked(state);
((CheckBox) rl.getTag(R.id.chk_selected)).setOnCheckedChangeListener(new chkOnCheckedChangeListener(contact.getId()));
if(!(contact.getFoto() == null || contact.getFoto().equals(""))) {
fillImageView(rl, R.id.contact_avatar, contact.getFoto());
}
fillTextViewNombre(rl, R.id.contact_name, contact.getName());
fillTextViewMail(rl, R.id.contact_info, contact.getInfo());
}
private void fillTextViewNombre(ViewGroup rl, int id, String description) {
TextView t = ((TextView) rl.getTag(id));
t.setText(description);
t.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
}
private void fillTextViewMail(ViewGroup rl, int id, String description) {
TextView t = ((TextView) rl.getTag(id));
t.setText(description);
t.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
}
private static void fillImageView(ViewGroup rl, int id, String bitmap) {
ImageView t = ((ImageView) rl.getTag(id));
MainActivity.imageLoader.DisplayImage(bitmap, t);
}
问题是 imageLoader 创建的线程在用户滚动时与列表视图不同步,所以我最终使用了通用图像下载器并且工作完美。
我正在实施 StickyListHeadersListView
以显示联系信息。我正在使用实现 StickyListHeadersAdapter
的 ArrayAdapter<Contact>
。工作正常,每个项目显示一个图像和一个字符串,问题是图像在滚动时交换,我不确定为什么
列表视图:
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:id="@+id/contact_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.01"
android:background="#FFFFFF">
</se.emilsjolander.stickylistheaders.StickyListHeadersListView>
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.contact_row, null, false);
convertView.setTag(R.id.chk_selected, convertView.findViewById(R.id.chk_selected));
convertView.setTag(R.id.contact_avatar, convertView.findViewById(R.id.contact_avatar));
convertView.setTag(R.id.contact_name, convertView.findViewById(R.id.contact_name));
convertView.setTag(R.id.contact_info, convertView.findViewById(R.id.contact_info));
convertView.setBackgroundColor(Color.WHITE);
}
fill((ViewGroup) convertView, getItem(position));
return convertView;
}
private void fill(ViewGroup rl, Contact contact) {
boolean state = itemChecked.get(contact.getId()) != null ? itemChecked.get(contact.getId()): false;
((CheckBox) rl.getTag(R.id.chk_selected)).setChecked(state);
((CheckBox) rl.getTag(R.id.chk_selected)).setOnCheckedChangeListener(new chkOnCheckedChangeListener(contact.getId()));
if(!(contact.getFoto() == null || contact.getFoto().equals(""))) {
fillImageView(rl, R.id.contact_avatar, contact.getFoto());
}
fillTextViewNombre(rl, R.id.contact_name, contact.getName());
fillTextViewMail(rl, R.id.contact_info, contact.getInfo());
}
private void fillTextViewNombre(ViewGroup rl, int id, String description) {
TextView t = ((TextView) rl.getTag(id));
t.setText(description);
t.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
}
private void fillTextViewMail(ViewGroup rl, int id, String description) {
TextView t = ((TextView) rl.getTag(id));
t.setText(description);
t.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
}
private static void fillImageView(ViewGroup rl, int id, String bitmap) {
ImageView t = ((ImageView) rl.getTag(id));
MainActivity.imageLoader.DisplayImage(bitmap, t);
}
问题是 imageLoader 创建的线程在用户滚动时与列表视图不同步,所以我最终使用了通用图像下载器并且工作完美。