0

So I have a custom ListView that contains a CheckBox as well as a TextView when I click the CheckBox I want it to cross out the TextView my code works for the top item on the list but if I click a CheckBox towards the bottom of the list it still crosses out the top TextView I am using an onClick approach in the xml I know its not the norm for a ListView its just that I didnt know how to handle two different xml elements with a 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 コールバックを生成するコードは、実行時にクリック コールバックを処理したい同じ View をさらに生成することを知る機会がありません。これが多かれ少なかれ、最初に生成された CheckBox (コールバックを受け取る唯一の CheckBox) に関連付けられているため、最初の 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]);

    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);
        }
    });

上記は次の場合に機能するようです:カスタム ArrayAdapter onClick の位置と行の強調表示

于 2013-09-25T00:07:18.483 に答える