При переключении на Detail, список RecyclerView не обновляется, а вместо этого у меня появляется пустой экран при возврате, как на картинке. Я знаю, что при использовании NavigationUI Fragment воссоздается. В приведенном ниже коде возвращаем результаты в ruleAdapter! = Нуль. Есть идея, когда вы нажимаете на элемент списка и go в Detail, чтобы сделать ruleAdapter = null, но я думаю, что это не так.
public class RuleListFragment extends Fragment {
private RecyclerView recyclerView;
private RuleAdapter ruleAdapter;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateRule();
return view;
}
public void updateRule() {
RuleLab ruleLab = RuleLab.get(getActivity());
List<Rule> rules = ruleLab.getRules();
if (ruleAdapter == null) {
ruleAdapter = new RuleAdapter(rules);
recyclerView.setAdapter(ruleAdapter);
} else {
ruleAdapter.setRules(rules);
ruleAdapter.notifyDataSetChanged();
}
}
private class RuleHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private Rule rule;
private ImageView ruleIcon;
private TextView ruleTitle;
private ImageButton ruleElect;
private RuleHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
ruleIcon = itemView.findViewById(R.id.ruleIcon);
ruleTitle = itemView.findViewById(R.id.ruleTitle);
ruleElect = itemView.findViewById(R.id.ruleElect);
ruleElect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean elect = !rule.isElect();
rule.setElect(elect);
RuleLab.get(getActivity()).updateRule(rule);
if (elect) {
ruleElect.setImageResource(R.drawable.ic_elect_on);
} else {
ruleElect.setImageResource(R.drawable.ic_elect_off);
}
updateRule();
}
});
}
private void bind (Rule rule) {
this.rule = rule;
int iconId = getResources().getIdentifier(rule.getIcon(), "drawable", getActivity().getPackageName());
ruleIcon.setImageResource(iconId);
ruleTitle.setText(rule.getTitle());
ruleElect.setImageResource(rule.isElect() ? R.drawable.ic_elect_on : R.drawable.ic_elect_off);
}
@Override
public void onClick(View view) {
Bundle args = new Bundle();
args.putSerializable("ruleId", rule.getId());
Navigation.findNavController(view).navigate(R.id.ruleFragment, args);
}
}
private class RuleAdapter extends RecyclerView.Adapter<RuleHolder> {
private List<Rule> rules;
private RuleAdapter (List<Rule> rules) {
this.rules = rules;
}
@NonNull
@Override
public RuleHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater.inflate(R.layout.item_recycler_rule, parent, false);
return new RuleHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RuleHolder holder, int position) {
Rule rule = rules.get(position);
holder.bind(rule);
}
@Override
public int getItemCount() {
return rules.size();
}
public void setRules(List<Rule> rules) {
this.rules = rules;
}
}
}
public class RuleLab {
private static RuleLab ruleLab;
private Context context;
private SQLiteDatabase database;
public static RuleLab get(Context context) {
if (ruleLab == null) {
ruleLab = new RuleLab(context);
}
return ruleLab;
}
private RuleLab (Context context) {
context = context.getApplicationContext();
database = new RuleBaseHelper(context).getWritableDatabase();
}
public List<Rule> getRules() {
List<Rule> rules = new ArrayList<>();
RuleCursorWrapper cursor = queryRules(null, null);
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
rules.add(cursor.getRule());
cursor.moveToNext();
}
} finally {
cursor.close();
}
return rules;
}
public Rule getRule(int id) {
RuleCursorWrapper cursor = queryRules("_id = ?", new String[] {Integer.toString(id)});
try {
if (cursor.getCount() == 0) {
return null;
}
cursor.moveToFirst();
return cursor.getRule();
} finally {
cursor.close();
}
}
private static ContentValues getContentValues(Rule rule) {
ContentValues values = new ContentValues();
values.put("elect", rule.isElect() ? 1 : 0);
return values;
}
public void updateRule (Rule rule) {
String idString = Integer.toString(rule.getId());
ContentValues values = getContentValues(rule);
database.update("rules", values,
"_id" + " = ?",
new String[] {idString});
}
private RuleCursorWrapper queryRules (String whereClause, String[] whereArgs) {
Cursor cursor = database.query(
"rules",
null,
whereClause,
whereArgs,
null,
null,
"elect DESC"
);
return new RuleCursorWrapper(cursor);
}
}
