2016-10-18 34 views
0

Ich versuche, programmgesteuert einen Rahmen zu bestimmten Zeilenelementen in einem ArrayAdapter hinzuzufügen, der in einem AlertDialog angezeigt wird. Grundsätzlich möchte ich dies nehmen:Android programmgesteuert Rahmen zu ArrayAdapter in AlertDialog hinzufügen

enter image description here

Und es so machen (so platzieren weiße Ränder auf der linken und rechten Seite der Ansichten für bestimmte Zeilen, schwarzen Rand oben VARIABLE enter image description here):

Hier ist der Code. Dies ist nur debu Code, also keine Sorge zu viel über Effizienz, da sie nur lokal ausgeführt werden und nur für die Fehlersuche:

public class RuleDebugItemAdapter extends ArrayAdapter<RuleDebugItem> { 
Context mContext; 
int mLayoutResourceId;  
ArrayList<RuleDebugItem> mData; 

public RuleDebugItemAdapter(Context context, int resource, ArrayList<RuleDebugItem> data) { 
    super(context, resource, data); 
    mContext = context; 
    mLayoutResourceId = resource; 
    mData = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = super.getView(position, convertView, parent); 
    TextView tv = (TextView) v.findViewById(android.R.id.text1); 
    RuleDebugItem item = mData.get(position); 

    tv.setSingleLine(false); 
    if (item.type.equalsIgnoreCase(Field.VARIABLE)) { 
     tv.setText(item.ruleDebugText); 
     tv.setTextSize(18); 
     tv.setTypeface(null, Typeface.BOLD); 
     v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.white)); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.black)); 
    } 
    else if (item.type.equalsIgnoreCase(Field.FORMRULE)) { 
     tv.setText(item.ruleDebugText); 
     tv.setTextSize(18); 
     tv.setTypeface(null, Typeface.BOLD); 
     v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.white)); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.black)); 
    } 
    else if (item.type.equalsIgnoreCase(Field.CONDITION_BLOCK)) { 
     tv.setText(item.ruleDebugText); 
     tv.setTextSize(18); 
     tv.setTypeface(null, Typeface.BOLD); 
     v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_orange_light)); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)); 
    } 
    else if (item.type.equalsIgnoreCase(Field.FUNCTION)) { 

     tv.setTextSize(16); 
     if (item.success) { 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_green_light)); 
      tv.setText(Field.SPACE + item.ruleDebugText); 
     } 
     else { 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_blue_bright)); 
      tv.setText("Init " + item.ruleDebugText); 
     } 

     tv.setTypeface(null, Typeface.BOLD); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)); 
    } 
    else if (item.type.equalsIgnoreCase(Field.ACTION)) { 

     tv.setTextSize(16); 
     if (item.success) { 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_green_light)); 
      tv.setText(Field.SPACE + item.ruleDebugText); 
     } 
     else { 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_blue_bright)); 
      tv.setText("Pre-" + item.ruleDebugText); 
     } 

     tv.setTypeface(null, Typeface.BOLD); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)); 
    } 
    else if (item.type.equals(Field.CONDITION)) { 
     tv.setText(item.ruleDebugText); 
     tv.setTextSize(16); 
     tv.setTypeface(null, Typeface.NORMAL); 
     if (item.success) 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_green_light)); 
     else 
      v.setBackgroundColor(ContextCompat.getColor(mContext,android.R.color.holo_red_light)); 
     tv.setTextColor(ContextCompat.getColor(mContext,android.R.color.white)); 
    } 
    return v; 
} 
} 

Alle in dem Bemühen, ein bisschen besser lesbar zu machen. Ja, ich weiß, die Farben sind hässlich und ich könnte stattdessen einen Baum machen .. :)

Antwort

0

Mit Adaptern haben Sie das Konzept Ansichtstypen. Sie können Ihren Adapter zum Spielen bringen, indem Sie getViewTypeCount und getItemViewType überschreiben.

Nehmen wir an, Sie machen ein anderes Layout, genau wie das Layout Ihrer Artikelliste, nur dass es den schwarzen Rand oben hat.

Zuerst fügen Sie diese:

 @Override 
     public int getViewTypeCount() { 
      return 2; 
     } 

     @Override 
     public int getItemViewType(int position) { 
      RuleDebugItem item = mData.get(position); 
      if (item.type.equalsIgnoreCase(Field.VARIABLE)) { 
       return 0; 
      } 
      return 1; 
     } 

Jetzt in Ihrem getView Sie das Layout mit der Grenze aufblasen können, wenn Sie einen variablen Einzelteil haben und das andere Layout für alles andere aufzublasen.

Da Ihr Adapter die Ansichtstypen ListView angegeben hat, können Sie davon ausgehen, dass beim erneuten Verwerten einer Ansicht das richtige Layout in jedem Fall angezeigt wird.

Sie könnten dies sogar erweitern, um drei Layouts zu haben, eines für jeden Typ und die Hintergrundfarbe und Textfarbe im Layout, was Ihren Code viel einfacher macht.

+0

Danke, ich werde es versuchen und sehen, was passiert. –

0

Versuchen Sie folgendes:

ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) tv 
       .getLayoutParams(); 
     marginLayoutParams.setMargins(10, 0, 10, 0); 

Sie können Randgröße nach Ihrem Bedarf anpassen.

+0

Leider stürzt die App nur mit einer ClassCast-Ausnahme ab. Soll das in getView() oder woanders gemacht werden? –

Verwandte Themen