Imageview 无法通过列表视图适配器正确显示
Imageview not displaying correctly through listview adapter
在我的适配器中,我有三种不同的视图,分别使用黄色、橙色和红色作为不同的文本颜色。为了配合这些,我尝试将三个不同的图像作为缩略图(hhy、hho、hhr)。当它运行时,图像与其相应的视图项目不匹配,我在列表视图中得到 hho 和 hhy 中的一个项目太早或太晚。我的 imageview 布局名称是正确的,所以我不确定为什么它们显示不正确。
PostItemAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
int listViewItemType = getItemViewType(position);
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
//viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
} else {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hhy);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hho);
} else {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hhr);
}
return convertView;
}
}
和相关布局postitem.xml
<ImageView
android:id="@+id/itemThumb"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hhy"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<ImageView
android:id="@+id/itemThumb1"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hho"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<ImageView
android:id="@+id/itemThumb2"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hhr"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<TextView
android:id="@+id/itemTitleLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ffff00"
android:ellipsize="end"
/>
<TextView
android:id="@+id/itemTitleLabel1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ffa500"
android:ellipsize="end"
/>
<TextView
android:id="@+id/itemTitleLabel2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ff0000"
android:ellipsize="end"
/>
正在发生的事情的图像;
好的,我的问题是,当回收列表视图视图时,它们覆盖或无法覆盖预先存在的 image/text。我相当老套的解决方案是使用以下代码。如果有人知道您应该如何解决这个问题,我很想听听:P
PostItemAdapter.java (ViewHolder)
static class ViewHolder
{
private TextView itemTitleViewY, itemTitleViewO, itemTitleViewR;
private ImageView itemThumbViewY, itemThumbViewO, itemThumbViewR;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
Item i = datas.get(position);
int listViewItemType = i.viewtype;
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
viewHolder.itemTitleViewY = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbViewY = (ImageView) convertView.findViewById(R.id.itemThumb);
viewHolder.itemTitleViewO = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbViewO = (ImageView) convertView.findViewById(R.id.itemThumb1);
viewHolder.itemTitleViewR = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbViewR = (ImageView) convertView.findViewById(R.id.itemThumb2);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
switch (listViewItemType) {
case 0:
viewHolder.itemTitleViewY.setText(i.itemTitle);
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewY.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType Y: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
case 1:
viewHolder.itemTitleViewO.setText(i.itemTitle);
viewHolder.itemTitleViewY.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewO.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType O: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
case 2:
viewHolder.itemTitleViewR.setText(i.itemTitle);
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewY.setText("");
viewHolder.itemThumbViewR.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType R: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
default:
viewHolder.itemTitleViewY.setText("");
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType D: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
}
return convertView;
}
您的问题中存在一些问题。回收视图仅 inflated/created 次足以首次完全填充 ListView 的可见部分。然后在您滚动时回收它们,而不是重新创建它们。
这意味着这个块只被调用了前几次:
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
//viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
} else {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
}
convertView.setTag(viewHolder);
}
对于后续的回收,您的 ViewHolder 可能指向了一个非预期的资源。如果当前项目是 TYPE_med,则 viewHolder.itemThumbView 可能是使用不同的资源引用创建的(即创建时的 TYPE_short)。解决这个问题仍然无法解决您的问题,因为您还有另外两个 ImageViews/TextViews 闲逛。
我看不出有任何明显的需要多个 ImageViews/TextViews 因此,与其设置所有内容的可见性,更可接受的方法是:
static class ViewHolder
{
private TextView mTextViewTitle;
private ImageView mImageViewThumb;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
Item i = datas.get(position);
int listViewItemType = i.viewtype;
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.mImageViewThumb = (ImageView) convertView.findViewById(R.id.itemThumb);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.mTextViewTitle.setText(i.itemTitle);
if (listViewItemType == TYPE_short) {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hhy);
} else if (listViewItemType == TYPE_med) {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hho);
} else {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ff0000"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hhr);
}
return convertView;
}
最好在资源中定义您的颜色,但我会把它留到下次讨论。
你的新 XML:
<ImageView
android:id="@+id/itemThumb"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="centerCrop"
android:layout_marginRight="5dp" />
<TextView
android:id="@+id/itemTitleLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:ellipsize="end" />
在我的适配器中,我有三种不同的视图,分别使用黄色、橙色和红色作为不同的文本颜色。为了配合这些,我尝试将三个不同的图像作为缩略图(hhy、hho、hhr)。当它运行时,图像与其相应的视图项目不匹配,我在列表视图中得到 hho 和 hhy 中的一个项目太早或太晚。我的 imageview 布局名称是正确的,所以我不确定为什么它们显示不正确。
PostItemAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
int listViewItemType = getItemViewType(position);
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
//viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
} else {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hhy);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hho);
} else {
viewHolder.itemTitleView.setText(datas.get(position).itemTitle);
viewHolder.itemThumbView.setImageResource(R.drawable.hhr);
}
return convertView;
}
}
和相关布局postitem.xml
<ImageView
android:id="@+id/itemThumb"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hhy"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<ImageView
android:id="@+id/itemThumb1"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hho"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<ImageView
android:id="@+id/itemThumb2"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/hhr"
android:scaleType="centerCrop"
android:layout_marginRight="5dp"/>
<TextView
android:id="@+id/itemTitleLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ffff00"
android:ellipsize="end"
/>
<TextView
android:id="@+id/itemTitleLabel1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ffa500"
android:ellipsize="end"
/>
<TextView
android:id="@+id/itemTitleLabel2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#ff0000"
android:ellipsize="end"
/>
正在发生的事情的图像;
好的,我的问题是,当回收列表视图视图时,它们覆盖或无法覆盖预先存在的 image/text。我相当老套的解决方案是使用以下代码。如果有人知道您应该如何解决这个问题,我很想听听:P
PostItemAdapter.java (ViewHolder)
static class ViewHolder
{
private TextView itemTitleViewY, itemTitleViewO, itemTitleViewR;
private ImageView itemThumbViewY, itemThumbViewO, itemThumbViewR;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
Item i = datas.get(position);
int listViewItemType = i.viewtype;
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
viewHolder.itemTitleViewY = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbViewY = (ImageView) convertView.findViewById(R.id.itemThumb);
viewHolder.itemTitleViewO = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbViewO = (ImageView) convertView.findViewById(R.id.itemThumb1);
viewHolder.itemTitleViewR = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbViewR = (ImageView) convertView.findViewById(R.id.itemThumb2);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
switch (listViewItemType) {
case 0:
viewHolder.itemTitleViewY.setText(i.itemTitle);
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewY.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType Y: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
case 1:
viewHolder.itemTitleViewO.setText(i.itemTitle);
viewHolder.itemTitleViewY.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewO.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType O: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
case 2:
viewHolder.itemTitleViewR.setText(i.itemTitle);
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewY.setText("");
viewHolder.itemThumbViewR.setVisibility(View.VISIBLE);
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType R: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
default:
viewHolder.itemTitleViewY.setText("");
viewHolder.itemTitleViewO.setText("");
viewHolder.itemTitleViewR.setText("");
viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE);
viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE);
Log.d("DEBUG CHECKME", "getItemViewType D: " + i.itemTitle + ", " + i.viewtype + ", " + i);
break;
}
return convertView;
}
您的问题中存在一些问题。回收视图仅 inflated/created 次足以首次完全填充 ListView 的可见部分。然后在您滚动时回收它们,而不是重新创建它们。
这意味着这个块只被调用了前几次:
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
//viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
if (listViewItemType == TYPE_short) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb);
} else if (listViewItemType == TYPE_med) {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1);
} else {
viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2);
viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2);
}
convertView.setTag(viewHolder);
}
对于后续的回收,您的 ViewHolder 可能指向了一个非预期的资源。如果当前项目是 TYPE_med,则 viewHolder.itemThumbView 可能是使用不同的资源引用创建的(即创建时的 TYPE_short)。解决这个问题仍然无法解决您的问题,因为您还有另外两个 ImageViews/TextViews 闲逛。
我看不出有任何明显的需要多个 ImageViews/TextViews 因此,与其设置所有内容的可见性,更可接受的方法是:
static class ViewHolder
{
private TextView mTextViewTitle;
private ImageView mImageViewThumb;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
Item i = datas.get(position);
int listViewItemType = i.viewtype;
if (convertView == null) {
convertView = inflater.inflate(R.layout.postitem, null);
viewHolder = new ViewHolder();
viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.itemTitleLabel);
viewHolder.mImageViewThumb = (ImageView) convertView.findViewById(R.id.itemThumb);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.mTextViewTitle.setText(i.itemTitle);
if (listViewItemType == TYPE_short) {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hhy);
} else if (listViewItemType == TYPE_med) {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hho);
} else {
viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ff0000"));
viewHolder.mImageViewThumb.setImageResource(R.drawable.hhr);
}
return convertView;
}
最好在资源中定义您的颜色,但我会把它留到下次讨论。
你的新 XML:
<ImageView
android:id="@+id/itemThumb"
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="centerCrop"
android:layout_marginRight="5dp" />
<TextView
android:id="@+id/itemTitleLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/itemThumb"
android:layout_toRightOf="@id/itemThumb"
android:maxLines="2"
android:textIsSelectable="false"
android:textSize="16sp"
android:textStyle="bold"
android:ellipsize="end" />