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

时间:2019-02-24 00:37:06

标签: java android android-layout baseadapter custom-arrayadapter

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

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

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

1 个答案:

答案 0 :(得分:0)

首先,正如@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部分。因此,每次将项目值设置为支架时,您只需设置背景颜色。