当复选框被按下时激活(高亮)textview



所以基本上我在我的应用程序中做一些像'options'的东西我希望它看起来有点像android选项。我使用ListViewBaseAdapter,我设法将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));

虽然我不确定确切的语法,但解决方案肯定是这样的。

正确的方法是将TextViewCheckBox都包含在一个LinearLayout中,然后将clickable="false"focusable="false"设置为两者,并且在单击布局时应管理所有onClick事件(因此布局将需要和ID)

最新更新