【问题标题】:How to get Data from Customize Dialog to Activity and pass that Data to recyclerView如何从自定义对话框获取数据到活动并将该数据传递给 recyclerView
【发布时间】:2018-10-26 06:25:12
【问题描述】:

如何从自定义对话框中获取数据到 Activity 并将该数据传递给 recyclerView

我尝试了下面的链接,但没有成功, How can I pass values between a Dialog and an Activity?

下面是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。请帮我解决一下这个。提前致谢。

【问题讨论】:

  • 你试过使用接口吗?
  • 是的,在自定义对话框中它有接口,但是数据没有从customDialog传递到Activity。请帮助我@edwin
  • 有人遇到了和你类似的问题,看看这个:stackoverflow.com/questions/4279787/…
  • 我已经引用了您提到但没有成功的相同链接。
  • 如果您使用界面,您应该能够从自定义对话框获取数据到您的活动。您是否尝试使用断点来检查您的代码是否触发了您正在覆盖的 finish() 方法?

标签: android android-recyclerview


【解决方案1】:

更改下一个代码:

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 变量在某处被覆盖,这就是它无法将数据传递给活动的原因。
【解决方案2】:

更改对话代码的以下部分,

    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 没有参加活动课程。请你帮我解决这个问题。
  • @Naveen 我已经编辑了我的答案你确定你的点击看起来完全像这样吗?因为如果代码是这样的,它应该可以工作。
  • 我用上面的代码试过了,没有成功。不走运 Jaydeep
  • 您可以放置​​调试点并检查是否调用了finish()方法。
【解决方案3】:

在多次讨论和查看代码之后。我确定在自定义对话框中调用的 .finish() 方法没有在活动类中被覆盖。这解释了为什么数据没有被传递。需要做的是获取 Activity 的引用并调用 .finish() 方法来覆盖该方法,因为它在 Activity 中而不是自定义对话框中。

这将在实现 OnMyDialogResult 接口的 MutipleResourcesActivity 中转换为 init 的上下文,并在活动中调用 .finish 的覆盖方法。请在您的自定义对话框类中使用它。 (如果当前上下文是实现 OnMyDialogResult 接口的活动,则可以进行强制转换)。

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

【讨论】:

  • 嗨 edwin,终于有数据了,但是当我第二次添加数据时,没有将数据设置为 recylerview。我已经编辑了帖子 setAdapter 是设置数据的方法。
  • 我不太明白你的意思。无论如何,我的回答是否解决了您的问题?如果是,请标记为已回答。如果没有,请发布回答您问题的答案。如果您有任何其他问题,请发布另一个问题。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多