Android以编程方式在AlertDialog中向ArrayAdapter视图添加边框

时间:2016-10-18 20:44:40

标签: android android-arrayadapter alertdialog getview

我正在尝试以编程方式将边框添加到AlertDialog中显示的ArrayAdapter中的某些行元素。基本上我想接受这个:

enter image description here

并按照这样设置(因此在某些行的视图的左侧和右侧放置白色边框,在VARIABLE 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;
}
}

所有努力使得更具可读性。是的,我知道颜色很难看,我可以做一棵树.. :)

2 个答案:

答案 0 :(得分:0)

使用适配器,您可以使用视图类型的概念。您可以通过覆盖getViewTypeCountgetItemViewType来启动适配器。

因此,假设您制作另一个布局,就像您的项目列表布局一样,只有顶部有黑色边框。

首先添加:

        @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视图类型,所以当视图被回收时,您可以在每种情况下获得正确的布局。

您甚至可以将其扩展为具有三种布局,每种类型一种,并处理布局中的背景颜色和文本颜色,这将使您的代码更加简单。

答案 1 :(得分:0)

试试这个:

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

您可以根据需要调整边距大小。