Адаптер не обновляется - PullRequest
       4

Адаптер не обновляется

0 голосов
/ 27 марта 2020

При переключении на 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);
    }
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...