自定义 ArrayAdapter<Object> ViewHolder:ImageView 更改 Listview 中的多个项目,而不仅仅是一个项目
custom ArrayAdapter<Object> ViewHolder : imageView changes for several items in Listview not for one only
好的,我遇到了这个自定义 ArrayAdapter 的问题
public class AuthorsAdapter extends ArrayAdapter<Entity> {
View row;
static class ViewHolder {
TextView textViewTitle;
TextView textViewEntitySummary;
ImageView imageViewPicture;
}
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
}
@Override
public View getView( final int position, View convertView, final ViewGroup parent) {
row = convertView;
final ViewHolder holder;
if (row == null) {
row = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
holder = new ViewHolder();
holder.textViewTitle = (TextView) row.findViewById(R.id.textView_TitleTopLeft);
holder.textViewEntitySummary = (TextView) row.findViewById(R.id.textView_EntitySummary);
holder.imageViewPicture = (ImageView) row.findViewById(R.id.imageView_author);
row.setTag(holder);
} else
holder = (ViewHolder) row.getTag();
holder.textViewTitle.setText(getItem(position).getTitle());
if (!getItem(position).getPictureURL().isEmpty())
Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
holder.textViewEntitySummary.setText(getItem(position).getBiography());
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
return row;
}
一切正常,期待 imageView onclicklistener :
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
}
我希望图像在点击时改变它的大小,它工作但是当我在我的视图中向下滚动时,我的 listView 中的随机其他项目受到点击第一个项目的影响......当我出现在我的listview 图像不再调整大小(在我点击的索引处)有任何提示可以使它完美地工作吗?
public class AuthorsAdapter extends ArrayAdapter<Entity> {
static class ViewHolder {
TextView textViewTitle;
TextView textViewEntitySummary;
ImageView imageViewPicture;
}
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
}
@Override
public View getView( final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
holder = new ViewHolder();
holder.textViewTitle = (TextView) convertView.findViewById(R.id.textView_TitleTopLeft);
holder.textViewEntitySummary = (TextView) convertView.findViewById(R.id.textView_EntitySummary);
holder.imageViewPicture = (ImageView) convertView.findViewById(R.id.imageView_author);
convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();
}
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
holder.textViewTitle.setText(getItem(position).getTitle());
if (!getItem(position).getPictureURL().isEmpty())
Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
holder.textViewEntitySummary.setText(getItem(position).getBiography());
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
return convertView;
}
好的,我通过参考
找到了解决方法
private LinkedList<Entity> entity;
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
this.entity = entity;
}
在构造函数中
然后而不是像你说的那样做:
.... else{
holder = (ViewHolder) convertView.getTag();
}
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
} .....
我像这样增强了 for 循环:
.... else{
holder = (ViewHolder) convertView.getTag();
}
for (Entity foo : entity) {
if (!foo.isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
25,
25));
} else if (foo.isImageResized())
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
} ....
请注意,我在我的 xml 布局中做了一些更改,所以现在图像就在标题下面 :) 我让它匹配 parent 以获得更大尺寸的图像...
顺便说一句,非常感谢@Ammar aly 的提示,它真的帮助了我
好的,我遇到了这个自定义 ArrayAdapter 的问题
public class AuthorsAdapter extends ArrayAdapter<Entity> {
View row;
static class ViewHolder {
TextView textViewTitle;
TextView textViewEntitySummary;
ImageView imageViewPicture;
}
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
}
@Override
public View getView( final int position, View convertView, final ViewGroup parent) {
row = convertView;
final ViewHolder holder;
if (row == null) {
row = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
holder = new ViewHolder();
holder.textViewTitle = (TextView) row.findViewById(R.id.textView_TitleTopLeft);
holder.textViewEntitySummary = (TextView) row.findViewById(R.id.textView_EntitySummary);
holder.imageViewPicture = (ImageView) row.findViewById(R.id.imageView_author);
row.setTag(holder);
} else
holder = (ViewHolder) row.getTag();
holder.textViewTitle.setText(getItem(position).getTitle());
if (!getItem(position).getPictureURL().isEmpty())
Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
holder.textViewEntitySummary.setText(getItem(position).getBiography());
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
return row;
}
一切正常,期待 imageView onclicklistener :
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
}
我希望图像在点击时改变它的大小,它工作但是当我在我的视图中向下滚动时,我的 listView 中的随机其他项目受到点击第一个项目的影响......当我出现在我的listview 图像不再调整大小(在我点击的索引处)有任何提示可以使它完美地工作吗?
public class AuthorsAdapter extends ArrayAdapter<Entity> {
static class ViewHolder {
TextView textViewTitle;
TextView textViewEntitySummary;
ImageView imageViewPicture;
}
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
}
@Override
public View getView( final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
holder = new ViewHolder();
holder.textViewTitle = (TextView) convertView.findViewById(R.id.textView_TitleTopLeft);
holder.textViewEntitySummary = (TextView) convertView.findViewById(R.id.textView_EntitySummary);
holder.imageViewPicture = (ImageView) convertView.findViewById(R.id.imageView_author);
convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();
}
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
holder.textViewTitle.setText(getItem(position).getTitle());
if (!getItem(position).getPictureURL().isEmpty())
Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
holder.textViewEntitySummary.setText(getItem(position).getBiography());
holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
}
}
});
return convertView;
}
好的,我通过参考
找到了解决方法private LinkedList<Entity> entity;
public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
super(context, 0, entity);
this.entity = entity;
}
在构造函数中 然后而不是像你说的那样做:
.... else{
holder = (ViewHolder) convertView.getTag();
}
if (!getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
getItem(position).setIsImageResized(true);
} else if (getItem(position).isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
getItem(position).setIsImageResized(false);
} else {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
} .....
我像这样增强了 for 循环:
.... else{
holder = (ViewHolder) convertView.getTag();
}
for (Entity foo : entity) {
if (!foo.isImageResized()) {
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
25,
25));
} else if (foo.isImageResized())
holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
} ....
请注意,我在我的 xml 布局中做了一些更改,所以现在图像就在标题下面 :) 我让它匹配 parent 以获得更大尺寸的图像...
顺便说一句,非常感谢@Ammar aly 的提示,它真的帮助了我