适配器在布局中设置了错误的颜色/没有图像怎么办?

False colors / no images are set by adapter in layout what to do?

The wrong colors look like you see in the image (in the square)

我为自定义 GridView 项目制作了一个适配器,但显示了错误的颜色。 我已经检查过了,但是它将正确的颜色整数传递给了适配器,所以我认为错误应该在其中。 感谢您的帮助。

public class Uebersichtadapter extends BaseAdapter {
private Context context;
private ArrayList<Uebersichtliste> liste;

public Uebersichtadapter(Context c, ArrayList<Uebersichtliste> liste) {
    context = c;
    this.liste = liste;
}

@Override
public int getCount() {
    return liste.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return 0;
}

private class ViewHolder {
    TextView titel;
    TextView underline;
    TextView text;
    RelativeLayout background;
    ImageView bild;
}

@Override
public View getView(int position, View convertView, ViewGroup
        parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ViewHolder holder = null;
    if (convertView==null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.uebersichtelement, null);
        GridView grid = (GridView)parent;
        int size = grid.getColumnWidth();
        convertView.setLayoutParams(new GridView.LayoutParams(size,size));
        holder.text = (TextView) convertView.findViewById(R.id.textView10);
        holder.underline  = (TextView) convertView.findViewById(R.id.textView9);
        holder.titel  = (TextView) convertView.findViewById(R.id.textView8);
        holder.background=(RelativeLayout) convertView.findViewById(R.id.uebbackground);
        holder.bild=(ImageView) convertView.findViewById(R.id.imageView3);
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }
    holder.titel.setText(liste.get(position).getTitel());
    holder.underline.setText(liste.get(position).getUnderline());
    holder.text.setText(liste.get(position).getText());
    Log.e("Test",String.valueOf(liste.get(position).getTextffarbe()));
    Log.e("Test",String.valueOf(liste.get(position).getBildfarbe()));
    holder.text.setTextColor(liste.get(position).getTextffarbe());
    if (String.valueOf(liste.get(position).getBildfarbe()).contains("drawable_border"))holder.background.setBackgroundResource(liste.get(position).getBildfarbe());
    else if (String.valueOf(liste.get(position).getBildfarbe()).contains("drawable")) holder.bild.setImageResource(liste.get(position).getBildfarbe());
    else holder.background.setBackgroundColor(liste.get(position).getBildfarbe());
    return convertView;
}

}

我不知道那里可能有什么问题,但无论如何必须有一些东西,它不能在列表中,也许在布局中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/uebbackground"
android:layout_width="150dp"
android:layout_height="150dp"
android:padding="5dp">

<ImageView
    android:id="@+id/imageView3"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp" />

<TextView
    android:id="@+id/textView8"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:singleLine="true"
    android:textColor="@android:color/black"
    android:textSize="12sp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/textView9"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:singleLine="true"
    android:textColor="@android:color/darker_gray"
    android:textSize="12sp" />

<TextView
    android:id="@+id/textView10"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:gravity="center"
    android:singleLine="true"
    android:textColor="@android:color/black"
    android:textSize="16sp"
    android:textStyle="bold" />

适配器中的数据是:

        a.add(new Uebersichtliste("Vorgeschlagenes Element",elemente.get(n).getsymbol(),elemente.get(n).getdeutsch(),hintergrund,1,textfarbe));

hintergund= 类似于 R.color.red textfarbe= 类似于 R.color.black

首先,正如@EugenPechanec 所说,您不应该在每次要访问属性时都从列表中获取该项目。因为多次调用同一个方法会降低性能。您不应使用以下内容:

...
holder.titel.setText(liste.get(position).getTitel());
holder.underline.setText(liste.get(position).getUnderline());
holder.text.setText(liste.get(position).getText());
Log.e("Test",String.valueOf(liste.get(position).getTextffarbe()));
Log.e("Test",String.valueOf(liste.get(position).getBildfarbe()));
holder.text.setTextColor(liste.get(position).getTextffarbe());

...

使用这样的东西:

...
// Get the item only once, then reuse it.
Uebersichtliste item = liste.get(position);

holder.titel.setText(item.getTitel());
holder.underline.setText(item.getUnderline());
holder.text.setText(item.getText());
...

holder.text.setTextColor(litem.getTextffarbe());

然后,您需要更改以下难以阅读且容易出错的代码:

if (String.valueOf(liste.get(position).getBildfarbe()).contains("drawable_border"))holder.background.setBackgroundResource(liste.get(position).getBildfarbe());
else if (String.valueOf(liste.get(position).getBildfarbe()).contains("drawable")) holder.bild.setImageResource(liste.get(position).getBildfarbe());
else holder.background.setBackgroundColor(liste.get(position).getBildfarbe());

像这样:

// call item.getBildfarbe() only once.
// bildfarbe is a drawable resource id (guessing)
int bildfarbeResId = item.getBildfarbe();

// and convert to string
String bildfarbe = (String) bildfarbeResId;

if(bildfarbe.contains("drawable_border")) {
   holder.background.setBackgroundResource(bildfarbeResId);
} else if(bildfarbe.contains("drawable")) {
   holder.bild.setImageResource(bildfarbeResId);
} else {
   holder.background.setBackgroundColor(bildfarbeResId);
}

现在,让我们剖析问题根源所在的最后一段代码。

您可以看到您正在尝试将 drawable id 转换为字符串:

// call item.getBildfarbe() only once.
// assuming bildfarbe is a drawable resource id.
int bildfarbeResId = item.getBildfarbe();

// and convert to string
String bildfarbe = (String) bildfarbeResId;

它会给你一个整数字符串,像这样:

String bildfarbe = "123456";

但随后您将其与非整数值进行比较:

if(bildfarbe.contains("drawable_border")) {
   ...
} else if(bildfarbe.contains("drawable")) {
   ...
} else {
   holder.background.setBackgroundColor(bildfarbeResId);
}

所以它总是落在else部分。因此,每次将项目值设置为 holder 时,只需设置背景颜色。