Dialog与(父)活动的数组适配器交互的最有效方法是什么?

时间:2015-03-14 06:08:16

标签: android sqlite android-arrayadapter alertdialog android-recyclerview

当前设置对话框的方式,应该从EditTexts中获取值并保存到数据库中(通过Sugar ORM简化的过程),然后放置新创建的SubjectInfo对象进入RecyclerView。包含notifyDataSetChanged();的方式给了我关于线程的错误(基本上没有线程在等待数据集的更改)。所以,我看到它有两条路径,但我仍然对每种方法的运作方式感到困惑。

选项1:以某种方式撤销onCreate()中的SubjectManagerActivity方法,以便适配器响应新数据库。 (如何撤销onCreate方法?)

选项2:创建自定义对话框片段活动。这会导航回来重新创建父活动吗?

请帮助解释如何进行notifyDataSetChanged();回复,因为一旦删除该行,就没有错误,但在重新启动应用之前,我无法看到新的主题卡。

这是我的代码:

public class SubjectManagerActivity extends ActionBarActivity {
    public static ArrayList<SubjectInfo> subjectList = new ArrayList<SubjectInfo>();
    public static FloatingActionButton fabCreateSubject;
    private AlertDialog.Builder build;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_subject_manager);
     RecyclerView recList = (RecyclerView) findViewById(R.id.subject_card_list);
     recList.setHasFixedSize(true);
     LinearLayoutManager llm = new LinearLayoutManager(this);
     llm.setOrientation(LinearLayoutManager.VERTICAL);
     recList.setLayoutManager(llm);
     subjectList = getSubjectInfoArrayList();
     SubjectAdapter sa = new SubjectAdapter(subjectList);
     recList.setAdapter(sa);

     fabCreateSubject = (FloatingActionButton) findViewById(R.id.fab_create_subject);
     fabCreateSubject.setOnClickListener (new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            build = new AlertDialog.Builder(SubjectManagerActivity.this);
            LayoutInflater inflater = getLayoutInflater();
            View alertview = inflater.inflate(R.layout.create_subject_dialog, null);

            // Pass null as the parent view because its going in the dialog layout
            build.setView(alertview);
            final EditText inputSubjectName = (EditText) alertview.findViewById(R.id.dialog_edit_subject_card_name);
            final EditText inputSubjectGrade = (EditText) alertview.findViewById(R.id.dialog_edit_subject_card_grade);

            build.setTitle("Add Subject")
                    .setPositiveButton("Save", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            String enteredSubjectName = inputSubjectName.getText().toString();
                            boolean enteredSubjectIsArchived = false;

                            if((!(inputSubjectName.getText().toString().equals("")))) {
                                SubjectInfo si = new SubjectInfo(enteredSubjectName, enteredSubjectIsArchived);
                                si.save();
                            } 
                            dialog.cancel();
                        }
                    })
                    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = build.create();
            alert.show();
        }
    });
}
public ArrayList<SubjectInfo> getSubjectInfoArrayList(){
    ArrayList<SubjectInfo> sial= new ArrayList<SubjectInfo>();
    List<SubjectInfo> sil = SubjectInfo.listAll(SubjectInfo.class);
    sial.addAll(sil);
    notifyDataSetChanged;
    return sial;

}

1 个答案:

答案 0 :(得分:0)

事实证明,处理问题的最有效方法是信任您的代码和研究以使其发挥作用!对于有类似问题的其他人,我提供了以下代码:

si.save();
subjectList.add(si);
sa.notifyDataSetChanged();

必须将方法notifyDataSetChanged();定向到适配器,该适配器是Thread的容器。虽然没有实时地从getSubjectInfoArrayList()方法填充适配器(当提示对话框时),但ArrayList仍然获取相同的值,并且当重新打开应用程序时,它可以从适配器填充适配器数据库(反过来,相同的get()方法)。