适配器在布局中设置假色/无图像该怎么办?

问题描述 投票:0回答:1

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

java android android-layout baseadapter custom-arrayadapter
1个回答
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部分。因此,每次将项目值设置为持有者时,您只需设置背景颜色。

© www.soinside.com 2019 - 2024. All rights reserved.