我正在尝试以编程方式将边框添加到AlertDialog中显示的ArrayAdapter中的某些行元素。基本上我想接受这个:
并按照这样设置(因此在某些行的视图的左侧和右侧放置白色边框,在VARIABLE 上方放置黑色边框):
这是代码。这只是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 :(得分: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
视图类型,所以当视图被回收时,您可以在每种情况下获得正确的布局。
您甚至可以将其扩展为具有三种布局,每种类型一种,并处理布局中的背景颜色和文本颜色,这将使您的代码更加简单。
答案 1 :(得分:0)
试试这个:
ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) tv
.getLayoutParams();
marginLayoutParams.setMargins(10, 0, 10, 0);
您可以根据需要调整边距大小。