按下复选框时激活(突出显示)textview

时间:2014-05-11 18:18:28

标签: android android-layout checkbox textview highlight

所以基本上我从我的应用程序中制作类似'选项'的东西,我希望它看起来有点像android选项。我正在使用ListViewBaseAdapter,我设法将textview和checkbox放入一行(因为标准复选框的文本在右侧,我希望它不是这样)。当我按下复选框时,我也想要突出显示文本视图(如在第二个屏幕上),但只突出显示框周围的小区域。第二个屏幕显示按下整个文本视图。这两个动作(在复选框或textview上预设)具有相同的结果,因此我不希望它们具有不同的外观。

第一个屏幕:http://i.stack.imgur.com/JY8Xw.png 第二个屏幕:http://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;
    }

}

3 个答案:

答案 0 :(得分:0)

将OnCheckedChangeListener添加到CheckBox视图,并在选中复选框时调用ListView.setSelection(position)。您可能需要一些逻辑函数来确定CheckBox所在的位置。

答案 1 :(得分:0)

在BaseAdapter的getView()方法中,您应该执行以下操作:

获取list_item.xml文件中的TextView或父视图的引用(您为listview的每一行创建的布局文件),并在onCheckedChangedListener方法中设置该视图的“backgroundcolor”属性,达到理想的颜色。 每个行项的父视图可能是RelativeLayout或LinearLayout。无论父母如何,您都可以访问“backgroundcolor”属性。

listitem_relativelayout.setBackgroundColor(
                 getApplicationContext().getColor(R.color.yourcolor));

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

答案 2 :(得分:0)

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