2016-10-18 3 views
0

Я пытаюсь добавить границу программно некоторым элементам строки в ArrayAdapter, который отображается в AlertDialog. В основном я хочу, чтобы принять это:Android программно добавляет границу в ArrayAdapter в AlertDialog

enter image description here

И сделать это так (так что размещение белых границ на левой и правой стороне представления для некоторых строк, черной окантовкой выше ПЕРЕМЕННОЙ enter image description here):

Вот код. Это просто Debu код, так что не слишком беспокоиться об эффективности, так как он будет работать только локально и только для отладки:

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; 
} 
} 

Все в попытке сделать это немного более удобным для чтения. Да, я знаю, что цвета уродливы, и я мог бы сделать дерево вместо этого. :)

ответ

0

С адаптерами у вас есть концепция виды вида. Вы можете заставить ваш адаптер играть, переопределяя getViewTypeCount и getItemViewType.

Итак, скажем, вы создаете другой макет, как и ваш макет списка элементов, только он имеет черную рамку сверху.

Сначала добавьте это:

 @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; 
     } 

Теперь в вашем getView вы можете надуть макет с границей, когда у вас есть переменная пункта, и надуть другой макет для всего остального.

Поскольку ваш адаптер сказал ListView о типах вида, вы можете ожидать, что когда просмотр будет переработан, вы получите правильный макет в каждом случае.

Вы можете даже расширить это, чтобы иметь три макета, по одному для каждого типа и обрабатывать цвет фона и цвет текста в макете, что сделает ваш код намного проще.

+0

Спасибо, я попробую и посмотрю, что произойдет. –

0

Попробуйте это:

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

Вы можете настроить размеры полей в соответствии с вашими потребностями.

+0

К сожалению, это просто приводит к сбою приложения с исключением ClassCast. Должно ли это быть сделано в getView() или где-то еще? –

 Смежные вопросы

  • Нет связанных вопросов^_^