所以基本上我在我的应用程序中做一些像'options'的东西我希望它看起来有点像android选项。我使用ListView
与BaseAdapter
,我设法将textview和复选框放入一行(因为标准复选框在右侧有其文本,我希望它是其他)。当我按下复选框时,我只想突出显示textview(就像在第二个屏幕上),但只有框周围的小区域被突出显示。第二个屏幕显示按下整个textview。这两个动作(按下复选框或textview)有相同的结果,所以我不希望他们有不同的外观。
第一个屏幕:https://i.stack.imgur.com/JY8Xw.png第二屏:https://i.stack.imgur.com/vNQis.png
//import [..]
public class OptionsAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private ArrayList<Option> options;
private final String TAG = "OptionsAdapter";
private static final int type_textBox = 0;
private static final int type_checkBox = 1;
private static final int type_separator = 2;
public OptionsAdapter(Context context, ArrayList<Option> options) {
this.context = context;
this.options = options;
inflater = LayoutInflater.from(context);
}
@Override
public int getItemViewType(int position) {
final Option opt = this.getItem(position);
return opt.getMode();
}
@Override
public int getCount() {
return options.size();
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public Option getItem(int position) {
return options.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
return options.get(position).getMode() == 2 ? false : true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final OptionsViewHolder ovh;
int type = getItemViewType(position);
final Option opt = this.getItem(position);
if (convertView == null) {
ovh = new OptionsViewHolder();
convertView = inflater.inflate(R.layout.row_text_checkbox, null);
ovh.setTextview((TextView) convertView
.findViewById(R.id.opt_row_text));
ovh.setCheckbox((CheckBox) convertView
.findViewById(R.id.opt_row_cb));
ovh.getTextview().setText(opt.getName());
ovh.getCheckbox().setText("");
switch (type) {
case type_checkBox:
ovh.getCheckbox().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
opt.toggle();
}
});
break;
case type_textBox:
ovh.getCheckbox().setVisibility(View.GONE);
break;
case type_separator:
ovh.getCheckbox().setVisibility(View.GONE);
TextView tv = ovh.getTextview();
tv.setTextSize(12);
tv.setAllCaps(true);
tv.setTextColor(Color.GRAY);
tv.setGravity(Gravity.CENTER);
tv.setPadding(10, 30, 10, 5);
break;
}
convertView.setTag(ovh);
} else {
ovh = (OptionsViewHolder) convertView.getTag();
}
ovh.getTextview().setText(opt.getName());
return convertView;
}
}
添加一个OnCheckedChangeListener到你的CheckBox视图,并调用ListView.setSelection(position)当复选框被选中。您可能需要一些逻辑函数来确定CheckBox所处的位置。
在BaseAdapter的getView()方法中,您应该执行以下操作:
在list_item.xml文件(为listview的每一行创建的布局文件)中获取TextView或父视图的引用,并在onCheckedChangedListener方法中设置该视图的"backgroundcolor"属性为所需的颜色。每个行项的父视图可能是RelativeLayout或LinearLayout。无论父元素是什么,你都可以访问"backgroundcolor"属性。
listitem_relativelayout.setBackgroundColor(
getApplicationContext().getColor(R.color.yourcolor));
虽然我不确定确切的语法,但解决方案肯定是这样的。
正确的方法是将TextView
和CheckBox
都包含在一个LinearLayout
中,然后将clickable="false"
和focusable="false"
设置为两者,并且在单击布局时应管理所有onClick
事件(因此布局将需要和ID)