Как получить данные из диалогового окна настройки в действие и передать эти данные в recyclerview

Как получить данные из диалогового окна настройки в Activity и передать эти данные в recyclerView.

Я пробовал ссылку ниже, но не сработало, Как я могу передавать значения между диалогом и действием?

Ниже представлен класс Activity

public class MutipleResourcesActivity extends AppCompatActivity implements View.OnClickListener, AddEachResourceDialog.OnMyDialogResult{

    RecyclerView list_resources;
    ImageView img_addResource;

    private ArrayList<AddResource> resources = new ArrayList<>();
    public AddResourceAdapter resourceAdapter;

    AddEachResourceDialog resourceDialog;

    String result1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.add_multiple_resources);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setContentInsetsRelative(0, toolbar.getContentInsetEnd());
        //toolbar.setContentInsetsAbsolute(0,0);
        setSupportActionBar(toolbar);
        toolbar.setTitle("Enter Timings");



        list_resources = (RecyclerView) findViewById(R.id.recyclerview_multiResources);
        img_addResource = (ImageView) findViewById(R.id.img_addResource);
        img_addResource.setOnClickListener(this);

    }

   private void setAdapter() {

    resourceAdapter = new AddResourceAdapter(resources);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    list_resources.setLayoutManager(mLayoutManager);
    list_resources.setItemAnimator(new DefaultItemAnimator());



    AddResource ar = new AddResource(mspinnerValue, mstartTime,mendTime);
    resources.add(ar);
    resourceAdapter.notifyDataSetChanged();

    list_resources.setAdapter(resourceAdapter);

    //resources.add(result1);
}


    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.img_addResource:

                try {

                    AddEachResourceDialog addEachResource = new AddEachResourceDialog(this);
                    //addEachResource.show(getSupportFragmentManager(), "Dialog");
                    addEachResource.show();
                    addEachResource.setWindowSize();

                }catch (Exception e){
                    e.printStackTrace();
                }
                break;
        }

    }

    @Override
    public void finish(String spinnerValue, String startTime, String endTime) {

        System.out.println("####### spinnerValue : "+spinnerValue);
        System.out.println("####### startTime : "+startTime);
        System.out.println("####### endTime : "+endTime);

        setAdapter();
    }
}

Ниже мой диалог настройки с интерфейсом «OnMyDialogResult».

public class AddEachResourceDialog extends BaseDialog implements View.OnClickListener{

    private Context context;

    private static DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    private static DateFormat tf = new SimpleDateFormat("HH:mm");
    private Calendar startDateTime, finishDateTime;

    private DatePickerDialog startDatePicker, finishDatePicker;
    private TimePickerDialog startTimePicker, finishTimePicker;


    Spinner spinner_resources;
    EditText edt_startTime, edt_endTime;
    Button btn_save, btn_cancel;

    TextView tv_basicStartDate, tv_basicStartTime, tv_basicFinishDate, tv_basicFinishTime;

    OnMyDialogResult mDialogResult;

    AddResource ads = new AddResource();

    public AddEachResourceDialog(Context context) {
        super(context);

        this.context = context;
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            setContentView(R.layout.add_each_resource);

            setTitle("Add Timings");

            spinner_resources = (Spinner) findViewById(R.id.spinner_resources);

            tv_basicStartDate = (TextView) findViewById(R.id.txt_basicStartDate);
            tv_basicFinishDate = (TextView) findViewById(R.id.txt_basicFinishDate);
            tv_basicStartTime = (TextView) findViewById(R.id.txt_basicStartTime);
            tv_basicFinishTime = (TextView) findViewById(R.id.txt_basicFinishTime);

            tv_basicStartDate.setOnClickListener(this);
            tv_basicFinishDate.setOnClickListener(this);
            tv_basicStartTime.setOnClickListener(this);
            tv_basicFinishTime.setOnClickListener(this);

            startDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime.add(Calendar.DAY_OF_MONTH, 1);

            tv_basicStartDate.setText(df.format(startDateTime.getTime()));
            tv_basicStartTime.setText(tf.format(startDateTime.getTime()));
            tv_basicFinishDate.setText(df.format(finishDateTime.getTime()));
            tv_basicFinishTime.setText(tf.format(finishDateTime.getTime()));


            btn_save = (Button) findViewById(R.id.saveBtn);
            btn_cancel = (Button) findViewById(R.id.cancelBtn);
            btn_save.setOnClickListener(this);
            btn_cancel.setOnClickListener(this);

        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()){

            case R.id.saveBtn:


                    mDialogResult = new OnMyDialogResult() {
                        @Override
                        public void finish(String spinnerValue, String startTime, String endTime) {

                            ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
                            ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
                            ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));

                            ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
                            ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));


                            mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());



                            mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());

                        }
                    };                 

                AddEachResourceDialog.this.dismiss();

                break;

            case R.id.cancelBtn:
                //onBackPressed();
                AddEachResourceDialog.this.dismiss();


                break;

            default:
                break;
        }

    }

    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        //void finish(AddEachResourceDialog result);
        void finish(String spinnerValue, String startTime, String endTime);
    }
}

Я не получаю данные из Dialog в Activity, и я должен передать эти данные в recyclerview. Пожалуйста, помогите мне с этим. Заранее спасибо.

Вы пробовали использовать интерфейс?

edwin 26.10.2018 08:29

Да, в диалоговом окне настройки есть интерфейс, но данные не передаются из customizeDialog в Activity. Пожалуйста, помогите мне с этим @edwin

Naveen 26.10.2018 08:31

у кого-то была проблема, похожая на вашу, проверьте это: stackoverflow.com/questions/4279787/…

edwin 26.10.2018 08:32

Я сослался на ту же ссылку, которую вы упомянули, но не сработала.

Naveen 26.10.2018 08:34

Вы должны иметь возможность получать данные из настраиваемого диалогового окна для своей деятельности, если вы используете интерфейс. Вы пытались использовать точку останова, чтобы проверить, запускает ли ваш код методы finish (), которые вы переопределяете?

edwin 26.10.2018 08:41

Это не вызов finish () @edwin

Naveen 26.10.2018 08:47

Означает, что что-то не так с интерфейсом, который вы реализовали. Кстати, вы должны попробовать что-то вроде ((AddEachResourceDialog.OnMyDialogResult) getActivity) .finish (ads.getName (), ads.getBasicStartDate () + ":" + ads.getBasicStartTime (), ads.getBasicFinishDate () + ":" + .getBasicFinishTime ());

edwin 26.10.2018 08:52

Предполагая, что ваш диалог находится в том же контексте, что и ваша деятельность.

edwin 26.10.2018 08:53

Вышеупомянутый код также не работает edwin. Пожалуйста, проверьте опубликованный код.

Naveen 26.10.2018 08:59

Кстати, я думаю, что ваша проблема заключается в вызываемом вами методе .finish (). Мне не кажется, что вы на самом деле вызываете переопределенный метод в действии, но вместо этого вы вызываете метод finish () класса диалога. Следовательно, вы ничего не получаете, так как это рекурсивно для своего собственного класса. Вам необходимо получить ссылку на действие, которое переопределяет метод .finish () в вашем настраиваемом диалоговом окне, и использовать эту ссылку для переопределения метода в настраиваемом диалоговом окне.

edwin 26.10.2018 09:01

Я изменил метод, хотя он не сработал. Не могли бы вы помочь мне с этим Эдвином.

Naveen 26.10.2018 09:05

Вы вообще можете использовать getActivity ()?

edwin 26.10.2018 09:05

Нет, getActivity () не работает в моем классе Activity

Naveen 26.10.2018 09:07

Я имею в виду называть это в вашем настраиваемом диалоговом окне.

edwin 26.10.2018 09:08

Нет, getActivity () также не работает в моем custonDialog

Naveen 26.10.2018 09:09

Я опубликовал ответ

edwin 26.10.2018 09:42

Эдвин не сработал.

Naveen 26.10.2018 09:42

он должен работать, потому что я тестировал его со своей стороны.

edwin 26.10.2018 09:44

edwin не работает. Пожалуйста, посмотрите код. Метод Callback не вызывается из customDialog.

Naveen 26.10.2018 10:46
1
19
516
3

Ответы 3

Измените следующий код:

public class AddEachResourceDialog extends BaseDialog implements View.OnClickListener{

    private Context context;

    private static DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    private static DateFormat tf = new SimpleDateFormat("HH:mm");
    private Calendar startDateTime, finishDateTime;

    private DatePickerDialog startDatePicker, finishDatePicker;
    private TimePickerDialog startTimePicker, finishTimePicker;


    Spinner spinner_resources;
    EditText edt_startTime, edt_endTime;
    Button btn_save, btn_cancel;

    TextView tv_basicStartDate, tv_basicStartTime, tv_basicFinishDate, tv_basicFinishTime;

    OnMyDialogResult mDialogResult;

    AddResource ads = new AddResource();

    public AddEachResourceDialog(MutipleResourcesActivity activity) {
        super(activity);

        mDialogResult = activity;
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            setContentView(R.layout.add_each_resource);

            setTitle("Add Timings");

            spinner_resources = (Spinner) findViewById(R.id.spinner_resources);

            tv_basicStartDate = (TextView) findViewById(R.id.txt_basicStartDate);
            tv_basicFinishDate = (TextView) findViewById(R.id.txt_basicFinishDate);
            tv_basicStartTime = (TextView) findViewById(R.id.txt_basicStartTime);
            tv_basicFinishTime = (TextView) findViewById(R.id.txt_basicFinishTime);

            tv_basicStartDate.setOnClickListener(this);
            tv_basicFinishDate.setOnClickListener(this);
            tv_basicStartTime.setOnClickListener(this);
            tv_basicFinishTime.setOnClickListener(this);

            startDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime.add(Calendar.DAY_OF_MONTH, 1);

            tv_basicStartDate.setText(df.format(startDateTime.getTime()));
            tv_basicStartTime.setText(tf.format(startDateTime.getTime()));
            tv_basicFinishDate.setText(df.format(finishDateTime.getTime()));
            tv_basicFinishTime.setText(tf.format(finishDateTime.getTime()));


            btn_save = (Button) findViewById(R.id.saveBtn);
            btn_cancel = (Button) findViewById(R.id.cancelBtn);
            btn_save.setOnClickListener(this);
            btn_cancel.setOnClickListener(this);

        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()){

            case R.id.saveBtn:

ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
                            ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
                            ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));

                            ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
                            ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));

//Which one you need?
                            mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());

                            mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());



                AddEachResourceDialog.this.dismiss();

                break;

            case R.id.cancelBtn:
                //onBackPressed();
                AddEachResourceDialog.this.dismiss();


                break;

            default:
                break;
        }

    }

    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        //void finish(AddEachResourceDialog result);
        void finish(String spinnerValue, String startTime, String endTime);
    }
}

Прежде всего, прокомментируйте метод setDialogResult (). Выглядит бесполезно. Во-вторых - журнал после каждого шага. Вам нужно указать, где именно он не работает. Возможно, переменная mDialogResult где-то перезаписана, поэтому она не может передавать данные активности.

Arthur 26.10.2018 09:25

Измените следующую часть вашего диалогового кода,

    case R.id.saveBtn:

    ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
    ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
    ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));
    ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
    ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));

    //Use either this finish method or that one, i don't see why did you call 
    //finish() twice  
    mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());

    mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());


    AddEachResourceDialog.this.dismiss();
    break;

Наконец, в своей деятельности замените метод onclick этим

    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.img_addResource:

                try {

                    AddEachResourceDialog addEachResource = new AddEachResourceDialog(this);
                    //addEachResource.show(getSupportFragmentManager(), "Dialog");
                    addEachResource.setDialogResult(this);
                    addEachResource.show();
                    addEachResource.setWindowSize();

                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }

    }

И у вас все хорошо.

вы поместили свой метод setDialogResult (this) после AddEachResourceDialog addEachResource = new AddEachResourceDialog (this); ?

jaydeep_gedia 26.10.2018 09:11

Это не относится к классу Activity Jaydeep, пожалуйста, помогите мне в этом.

Naveen 26.10.2018 09:16

@Naveen, я отредактировал свой ответ, вы уверены, что ваш клик выглядит именно так? потому что он должен работать, если код такой.

jaydeep_gedia 26.10.2018 09:32

Я пробовал с приведенным выше кодом, не сработало. Не повезло, Джейдип

Naveen 26.10.2018 09:40

вы можете поставить точки отладки и проверить, вызывается ли метод finish ().

jaydeep_gedia 26.10.2018 11:11

После обсуждения и просмотра кодов несколько раз. Я уверен, что методы .finish (), вызываемые в настраиваемом диалоговом окне, не переопределяются в классе активности. Это объясняет, почему данные не передаются. Что нужно было сделать, так это получить ссылку на ваше действие и вызвать метод .finish (), чтобы переопределить метод, как он есть в действии, а не в настраиваемом диалоговом окне.

Это приведет к приведению контекста, который был инициализирован в MutipleResourcesActivity, который реализовывал интерфейс OnMyDialogResult, и вызовет метод переопределения .finish в действии. Пожалуйста, используйте это в своем настраиваемом диалоговом классе. (приведение типов возможно, если текущий контекст является действием, реализующим интерфейс OnMyDialogResult).

((AddEachResourceDialog.OnMyDialogResult) context).finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());

Привет, Эдвин, наконец, данные приходят, но когда я добавляю данные во второй раз, не устанавливая данные для recylerview. Я отредактировал сообщение, setAdapter - это метод настройки данных.

Naveen 26.10.2018 12:34

Я не совсем понимаю, что вы. В любом случае мой ответ решил вашу проблему? Если да, отметьте, пожалуйста, ответ. Если нет, опубликуйте ответ, который отвечает на ваш вопрос. Если у вас есть другие вопросы, задайте другой вопрос.

edwin 29.10.2018 06:31

Другие вопросы по теме