0

所以我有一个ListView包含 a 和 a 的自定义,CheckBoxTextView我单击时CheckBox我希望它划掉TextView我的代码适用于列表中的顶部项目,但是如果我单击CheckBox列表底部的 a 它仍然划掉顶部TextView我在 xml 中使用 onClick 方法我知道它不是标准,ListView只是我不知道如何处理两个不同的 xml 元素onListItemClick

public void verify(View view)
    {
        CheckBox cb = (CheckBox) findViewById(R.id.checkBox1);
        TextView t= (TextView) findViewById(R.id.label);
        Toast.makeText(this, t.getText(), Toast.LENGTH_SHORT).show();

        t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
    }



<?xml version="1.0" encoding="utf-8"?>

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="verify"
     />

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="tasks"
    android:textSize="30px" >
</TextView>

public class MobileArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public MobileArrayAdapter(Context context, String[] values ) {
        super(context, R.layout.activity_task_list, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.activity_task_list, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        textView.setText(values[position]);


        return rowView;
    }

}
4

1 回答 1

0

当为 onClick 使用 XML 功能时,只会为该特定视图调用 onClick 方法。也就是说,在编译时生成 onClick 回调的代码将没有机会知道您在运行时生成了更多您希望从中处理点击回调的相同视图。这或多或少是只有第一个 TextView 是虚线的原因,因为它与第一个生成的 CheckBox 相关联,这是唯一一个接收回调的 CheckBox。

如果您将代码更改为:

public class MobileArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;

public MobileArrayAdapter(Context context, String[] values ) {
    super(context, R.layout.activity_task_list, values);
    this.context = context;
    this.values = values;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.activity_task_list, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.label);
    textView.setText(values[position]);

    CheckBox cb = (CheckBox) rowView.findViewById(R.id.checkBox1);
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                textView.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            }
        }
    });

    return rowView;
}

如果这不起作用,那么也许你在哪里应用你的适配器:

    MobileArrayAdapter mobileArrayAdapter = new MobileArrayAdapter(this,
            R.layout.activity_task_list,yourvalues);

    list = (ListView) findViewById(R.id.yourlist);

    list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
               // fetch TextView from the view 
               textView.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }
    });

以上似乎适用于:Custom ArrayAdapter onClick position & row highlight

于 2013-09-25T00:07:18.483 回答