Android ExpandableListView项目图像消失

时间:2015-03-13 11:18:34

标签: android listview imageview expandablelistview

我必须在列表中显示足球运动员列表。没问题,一切正常,但是当我向下滚动列表时,国籍的小旗子正在消失。

以下是它应该是什么样的:list item player OK
这是我滚动后的结果:list item player NOK

我还有一个关于玩家肖像的图像和另一个显示工作正常的衬衫的图像。

以下是我的代码的一部分(我只是放了一些部分来减小尺寸并放弃工作,但如果需要可以随意提出更多信息):

我的项目列表布局(部分布局,您将得不到与图像显示相同的结果):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="3dp"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:paddingTop="3dp"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/portrait"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:background="@drawable/portrait_default" />

    <LinearLayout
        android:id="@+id/nationalityLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/logoNationality"
            android:layout_width="13dp"
            android:layout_height="13dp"
            android:layout_marginRight="3dp" />

        <TextView
            android:id="@+id/nationality"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:textSize="13dp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/shirt"
        android:layout_width="40dp"
        android:layout_height="32dp"
        android:gravity="center_horizontal" >

        <TextView
            android:id="@+id/number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="5dp" />
    </LinearLayout>
</LinearLayout>

我的物品持有人:

private class ChildViewHolder {
    public ImageView portrait;
    public ImageView logoNationality;
    public TextView nationality;
    public LinearLayout nationalityLayout;
    public LinearLayout shirt;
    public TextView number;

    public void reset() {
        portrait.setImageBitmap(null);
        portrait.setBackgroundResource(R.drawable.portrait_default);
        nationalityLayout.setVisibility(View.VISIBLE);
        nationality.setText("");
        number.setText("");
    }
}

来自我的适配器的getChildView(在将项放入适配器列表并且playerShirt之前加载了BitmapDrawable时,标志是填充的映射):

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    ChildViewHolder holder;

    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.liste_item, null);
        holder = new ChildViewHolder();
        holder.portrait = (ImageView) convertView.findViewById(R.id.portrait);
        holder.nationalityLayout = (LinearLayout) convertView.findViewById(R.id.nationalityLayout);
        holder.logoNationality = (ImageView) convertView.findViewById(R.id.logoNationality);
        holder.nationality = (TextView) convertView.findViewById(R.id.nationality);
        holder.shirt= (LinearLayout) convertView.findViewById(R.id.shirt);
        holder.number = (TextView) convertView.findViewById(R.id.number);

        convertView.setTag(holder);
    } else {
        holder = (ChildViewHolder) convertView.getTag();
        holder.reset();
    }

    FootPlayer player = children.get(groupPosition).get(childPosition);

    // Doing nothing with portrait for now
    if (player.getNationality() != null) {
        holder.nationalityLayout.setVisibility(View.VISIBLE);
        holder.nationality.setText(player.getNationality());
        if (player.getNatImg() != null) {
            holder.logoNationality.setImageDrawable(flags.get(player.getNatImg()));
        } else {
            holder.logoNationality.setVisibility(View.INVISIBLE);
        }
    } else {
        holder.nationalityLayout.setVisibility(View.GONE);
    }
    holder.shirt.setBackgroundDrawable(playerShirt);
    holder.number.setText(String.valueOf(player.getNumber()));

    return convertView;
}

现在,标志出现在列表的开头,证明我的标志图正确填充了我的图像,但是当我向下滚动时,它们开始随机消失,最后它们都不会再显示出来。

重要的一点是:

  • 我的标志地图已正确填充BitmapDrawable(和正确的密钥)
  • 我的playerShirt也是一个BitmapDrawable但不会像标志那样消失
  • 我已经尝试使用setBitmapImage而不是setBitmapDrawable来设置标志图像(并设置背景,因为我正在使用这件衬衫)
  • 我尝试使用可绘制的res图像,我的结果相同
  • 我知道我通过我的if条件正确显示旗帜

非常感谢有关此问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

您没有像logoNationality那样将VISIBLE观看次数设置回nationalityLayout。所以我想,一旦它第一次消失,它仍然是隐形的,即使你后来重新使用视图设置一个可绘制的。

查看固定代码:

if (player.getNationality() != null) {
    holder.nationalityLayout.setVisibility(View.VISIBLE); // <- SET VISIBLE, Well done!
    holder.nationality.setText(player.getNationality());

    holder.logoNationality.setVisibility(View.VISIBLE); // <- Missing line: SET VISIBLE as before.
    if (player.getNatImg() != null) {
       holder.logoNationality.setImageDrawable(flags.get(player.getNatImg()));
    } else {
        holder.logoNationality.setVisibility(View.INVISIBLE);  // <- OK, no logo, so hide it.
    }
} else {
    holder.nationalityLayout.setVisibility(View.GONE); // No nationality, hides entire layout.
}