繁体   English   中英

多次膨胀时与点击侦听器布局有关的问题

[英]Issue related to click listener layout when inflated multiple times

我在另一个布局中将布局放大了四倍,现在我想向布局中的几个控件添加点击侦听器。这样做时,它仅更改最后一个布局的值,而不是更改为相应的布局。

公共类DRSDetail扩展Activity {

TextView changeCode;
Button generate, fromVessel, toVessel;
String strFromVessel, strToVessel, stroverTime, stroffShoreTime,
        stronShoreTime;
Spinner spinnerValues;
Date dateOne, dateTwo;
EditText overTime, offShoreTime, onShoreTime;
ArrayList<String> dataValues = new ArrayList<String>();
View layout_number;
int idValue = 10;
int i;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.drsdetail);

    changeCode = (TextView) findViewById(R.id.changeCode);
    generate = (Button) findViewById(R.id.generate);

    LinearLayout parent = (LinearLayout) findViewById(R.id.parentLayout);

    loadSpinnerData();
    for (i = 0; i < 4; i++) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout row = new LinearLayout(this);
        layout_number = inflater.inflate(R.layout.layoutinflate, parent,
                false);

        spinnerValues = (Spinner) layout_number
                .findViewById(R.id.spinnerValues);

        fromVessel = (Button) layout_number.findViewById(R.id.fromVessel);

        toVessel = (Button) layout_number.findViewById(R.id.toVessel);

        overTime = (EditText) layout_number.findViewById(R.id.overTimeEdit);

        offShoreTime = (EditText) layout_number
                .findViewById(R.id.offShoreEdit);

        onShoreTime = (EditText) layout_number
                .findViewById(R.id.onShoreEdit);

        row.addView(layout_number);
        parent.addView(row);
        assignClickListener(fromVessel);
        ArrayAdapter<String> adapterDataValues = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, dataValues);
        adapterDataValues
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinnerValues.setAdapter(adapterDataValues);
    }

}

private void assignClickListener(final View vessel) {
    fromVessel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Calendar mcurrentTime = Calendar.getInstance();
            int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
            int minute = mcurrentTime.get(Calendar.MINUTE);
            TimePickerDialog mTimePicker;
            mTimePicker = new TimePickerDialog(DRSDetail.this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker arg0,
                                int selectedHour, int selectedMinute) {
                            fromVessel.setText(selectedHour + ":"
                                    + selectedMinute);
                            strFromVessel = fromVessel.getText().toString();
                            System.out.println("strFromVessel"
                                    + strFromVessel);

                        }
                    }, hour, minute, true);// Yes 24 hour time
            mTimePicker.setTitle("Select Time");
            mTimePicker.show();

        }
    });
};

private void loadSpinnerData() {
    dataValues.clear();
    try {
        System.out.println("in try");
        DBHelper dbHelper = new DBHelper(DRSDetail.this);
        dbHelper.openDataBase();
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        // project number
        Cursor crData = db.rawQuery("SELECT DRS_ID FROM  DRS_TBL", null);
        if (crData.getCount() > 0) {
            while (crData.moveToNext()) {
                dataValues.add(crData.getString(0));
                System.out.println("value of cr.getString "
                        + crData.getString(0));

            }
        }

        crData.close();
    } catch (Exception e) {
        System.out.println("exception");
    }

}

您的变量fromVessel每次在循环中都会重新分配,因此在上一次循环迭代中,它将分配给最终视图。 每当调用OnClickListener时,它都会使用该视图-不管哪个视图调用了Click侦听器。

您需要一个闭包,以便您可以引用每个不同的视图。 您无法创建临时变量,因为必须将其声明为final。

您可以执行一些操作,例如将setOnClickListener分解为它自己的函数范围:

private void assignClickListener(final View vessel) {
   vessel.setOnClickListener(new OnClickListener() {
       // Time picker stuff...
   });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM