当前设置对话框的方式,应该从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;
}
答案 0 :(得分:0)
事实证明,处理问题的最有效方法是信任您的代码和研究以使其发挥作用!对于有类似问题的其他人,我提供了以下代码:
si.save();
subjectList.add(si);
sa.notifyDataSetChanged();
必须将方法notifyDataSetChanged();
定向到适配器,该适配器是Thread的容器。虽然没有实时地从getSubjectInfoArrayList()
方法填充适配器(当提示对话框时),但ArrayList仍然获取相同的值,并且当重新打开应用程序时,它可以从适配器填充适配器数据库(反过来,相同的get()方法)。