Я новичок в Android Studio, создавая мое первое приложение для Uni. Я делаю приложение Hobby Tracker. В каждом хобби пользователь может иметь различные списки проектов. Каждый список проектов имеет имя (пользовательский ввод) и список целей (флажок). Проблема в том, что цели сохраняются только при создании нового списка проектов. Если я не создам список, цели, достигнутые в этом случае, исчезают, когда я сбросил приложение. ViewPager2 projRecyclerView;
private ProjAdapter projAdapter;
private String hobbyName;
private String projName;
int hobbyLogo;
private Hobby currHobby;
private ArrayList allProjectLists = new ArrayList();
private ProjectList currProj;
private int currProjList = 0;
private ArrayList goals = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_hobby_details);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.Main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
projRecyclerView = findViewById(R.id.projRecyclerView);
TextView hobby = findViewById(R.id.hobby);
ImageView logo = findViewById(R.id.logohobby);
ImageView rightArrow = findViewById(R.id.rightarrow);
ImageView leftArrow = findViewById(R.id.leftarrow);
ImageButton addProj = findViewById(R.id.addProj);
hobbyName = getIntent().getStringExtra("hobbyName");
hobby.setText(hobbyName);
hobbyLogo = getIntent().getIntExtra("hobbyLogo", -1);
logo.setImageResource(hobbyLogo);
currHobby = new Hobby(hobbyName, hobbyLogo);
loadProjectLists();
if (!allProjectLists.isEmpty()) {
projAdapter = new ProjAdapter(this, Collections.singletonList(allProjectLists.get(currProjList)), goals ->{
this.goals = goals;
saveGoals();
});
projRecyclerView.setAdapter(projAdapter);
currProj = allProjectLists.get(currProjList);
projName = currProj.getName();
goals = currProj.getProjects();
saveGoals();
}
else{
currProj = new ProjectList("Проект", new ArrayList());
allProjectLists.add(currProj);
projName = currProj.getName();
goals = currProj.getProjects();
saveData("ProjectsData", allProjectLists);
}
loadGoals();
addProj.setOnClickListener(v -> showAddProjectDialog());
leftArrow.setOnClickListener(v ->{
if (currProjList > 0){
currProjList--;
showCurrProj();
}
});
rightArrow.setOnClickListener(v ->{
if (currProjList < allProjectLists.size() -1){
currProjList++;
showCurrProj();
}
});
}
private void showCurrProj(){
if (!allProjectLists.isEmpty() && currProjList >= 0 && currProjList < allProjectLists.size()) {
currProj = allProjectLists.get(currProjList);
projName = currProj.getName();
goals = currProj.getProjects();
projAdapter = new ProjAdapter(this, Collections.singletonList(currProj), this);
projRecyclerView.setAdapter(projAdapter);
}
}
private void showAddProjectDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Add project list");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("Add", (dialog, which) -> {
String projectName = input.getText().toString();
if (!projectName.isEmpty()) {
currProj = new ProjectList(projectName, new ArrayList());
allProjectLists.add(currProj);
currProjList = allProjectLists.size() - 1;
showCurrProj();
saveData("ProjectsData", allProjectLists);
saveGoals();
if (goals == null) {
goals = new ArrayList();
}
currProj.setProjects(goals);
saveGoals();
}
});
builder.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel());
builder.show();
}
public void saveData(String key, Object data){
SharedPreferences sharedPreferences = getSharedPreferences(key, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(data);
editor.putString(hobbyName, json);
editor.apply();
}
private T loadData(String key, Type type){
SharedPreferences sharedPreferences = getSharedPreferences(key, Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString(hobbyName, null);
if (json != null){
try{
return gson.fromJson(json, type);
}
catch (JsonSyntaxException e){
e.printStackTrace();
return null;
}
}
return null;
}
public void saveGoals(){
Log.d("HobbyDetails", "Saving goals for project: " + projName + ", goals count: " + goals.size());
Log.d("SAVE_GOALS", "Saving " + goals.size() + " goals for: " + projName);
SharedPreferences prefs = getSharedPreferences("GoalsData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(goals);
editor.putString(projName, json);
editor.apply();
currProj.setProjects(goals);
}
private void loadGoals(){
Log.d("HobbyDetails", "Loading goals for project: " + projName);
SharedPreferences prefs = getSharedPreferences("GoalsData", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(projName, null);
Type type = new TypeToken() {}.getType();
if (json!= null){
goals = gson.fromJson(json, type);
Log.d("HobbyDetails", "Loaded " + goals.size() + " goals.");
}
else{
goals = new ArrayList();
}
currProj.setProjects(goals);
}
private void loadProjectLists() {
Type type = new TypeToken() {}.getType();
ArrayList loadedLists = loadData("ProjectsData", type);
allProjectLists = loadedLists != null ? loadedLists : new ArrayList();
}
@Override
public void onGoalsChanged(ArrayList goals) {
this.goals = goals;
saveGoals();
}
}
projAdapter(for the whole list):
public class ProjAdapter extends RecyclerView.Adapter {
private final List projectLists;
private final Context context;
private final LayoutInflater inflater;
private final onGoalsChangedListener listener;
public ProjAdapter(Context context, List projects, onGoalsChangedListener listener){
this.projectLists = projects;
this.listener = listener;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public ProjAdapter.ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.proj_item,parent,false);
return new ProjViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ProjAdapter.ProjViewHolder holder, int position) {
ProjectList projectList = projectLists.get(position);
holder.projectName.setText(projectList.getName());
ProjectAdapter projectAdapter = new ProjectAdapter(projectList.getProjects(), context, goals ->{
if (listener != null){
listener.onGoalsChanged(projectList.getProjects());
}
});
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
holder.goalRecyclerView.setLayoutManager(layoutManager);
holder.goalRecyclerView.setAdapter(projectAdapter);
holder.addButton.setOnClickListener(v ->
showAddProjectDialog(projectList, projectAdapter));
}
private void showAddProjectDialog(ProjectList projectList, ProjectAdapter projectAdapter){
AlertDialog.Builder builder= new AlertDialog.Builder(context);
View dialogView = inflater.inflate(R.layout.add_goal_dialog,null);
EditText projectInput = dialogView.findViewById(R.id.goalName);
ImageView ok = dialogView.findViewById(R.id.okGoal);
ImageView cancel = dialogView.findViewById(R.id.cancelGoal);
builder.setView(dialogView);
AlertDialog dialog = builder.create();
ok.setOnClickListener(v -> {
String projectText = projectInput.getText().toString().trim();
if(!projectText.isEmpty()){
Project newProject = new Project(projectText);
projectList.getProjects().add(newProject);
projectAdapter.notifyDataSetChanged();
if (listener != null){
listener.onGoalsChanged(projectList.getProjects());
}
}
dialog.dismiss();
});
cancel.setOnClickListener(v -> dialog.dismiss());
dialog.show();
}
@Override
public int getItemCount() {
return projectLists.size();
}
public static class ProjViewHolder extends RecyclerView.ViewHolder{
TextView projectName;
RecyclerView goalRecyclerView;
Button addButton;
ImageView list;
public ProjViewHolder(@NonNull View itemView) {
super(itemView);
projectName = itemView.findViewById(R.id.projectName);
goalRecyclerView = itemView.findViewById(R.id.projectRecyclerView);
addButton = itemView.findViewById(R.id.addGoal);
list = itemView.findViewById(R.id.projectsList);
}
}
public interface onGoalsChangedListener{
void onGoalsChanged(ArrayList goals);
}
}
ProjectAdapter(for goals):
public class ProjectAdapter extends RecyclerView.Adapter {
Context context;
ArrayList projects;
private final ProjAdapter.onGoalsChangedListener listener;
public ProjectAdapter(ArrayList projects, Context context, ProjAdapter.onGoalsChangedListener listener) {
this.projects = projects;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public ProjectAdapter.ProjectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.project_item, parent, false);
return new ProjectViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ProjectAdapter.ProjectViewHolder holder, int position) {
Project project = projects.get(position);
holder.projectCheckBox.setText(project.getProjectName());
holder.projectCheckBox.setOnCheckedChangeListener(null);
holder.projectCheckBox.setChecked(project.isCompleted());
holder.projectCheckBox.setOnCheckedChangeListener(((buttonView, isChecked) -> {
new Handler().post(() -> {
project.setCompleted(isChecked);
notifyItemChanged(position);
if (listener!= null){
listener.onGoalsChanged(projects);
}
/*((hobby_details) context).saveData("HobbyProjects", projects);*/
});
}));
}
@Override
public int getItemCount() {
return projects.size();
}
public static class ProjectViewHolder extends RecyclerView.ViewHolder{
CheckBox projectCheckBox;
public ProjectViewHolder(@NonNull View itemView) {
super(itemView);
projectCheckBox = itemView.findViewById(R.id.projectCheckBox);
}
}
}
Project class:
public class Project{
private final String projectName;
private boolean isCompleted;
public Project(String projectName) {
this.projectName = projectName;
this.isCompleted = false;
}
public String getProjectName() {
return projectName;
}
public boolean isCompleted() {
return isCompleted;
}
public void setCompleted(boolean completed) {
isCompleted = completed;
}
}
proj class:
public class ProjectList {
private String name;
private ArrayList projects;
public ProjectList(String name, ArrayList projects) {
this.name = name;
this.projects = projects;
}
public String getName() {
return name;
}
public ArrayList getProjects() {
return projects;
}
public void addProject(Project project){
projects.add(project);
}
public void setProjects(ArrayList projects) {
this.projects = projects;
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... ject-lists
Не могу сэкономить цели в просмотре переработчика в списках проектов ⇐ Android
Форум для тех, кто программирует под Android
1744630109
Anonymous
Я новичок в Android Studio, создавая мое первое приложение для Uni. Я делаю приложение Hobby Tracker. В каждом хобби пользователь может иметь различные списки проектов. Каждый список проектов имеет имя (пользовательский ввод) и список целей (флажок). Проблема в том, что цели сохраняются только при создании нового списка проектов. Если я не создам список, цели, достигнутые в этом случае, исчезают, когда я сбросил приложение. ViewPager2 projRecyclerView;
private ProjAdapter projAdapter;
private String hobbyName;
private String projName;
int hobbyLogo;
private Hobby currHobby;
private ArrayList allProjectLists = new ArrayList();
private ProjectList currProj;
private int currProjList = 0;
private ArrayList goals = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_hobby_details);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.Main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
projRecyclerView = findViewById(R.id.projRecyclerView);
TextView hobby = findViewById(R.id.hobby);
ImageView logo = findViewById(R.id.logohobby);
ImageView rightArrow = findViewById(R.id.rightarrow);
ImageView leftArrow = findViewById(R.id.leftarrow);
ImageButton addProj = findViewById(R.id.addProj);
hobbyName = getIntent().getStringExtra("hobbyName");
hobby.setText(hobbyName);
hobbyLogo = getIntent().getIntExtra("hobbyLogo", -1);
logo.setImageResource(hobbyLogo);
currHobby = new Hobby(hobbyName, hobbyLogo);
loadProjectLists();
if (!allProjectLists.isEmpty()) {
projAdapter = new ProjAdapter(this, Collections.singletonList(allProjectLists.get(currProjList)), goals ->{
this.goals = goals;
saveGoals();
});
projRecyclerView.setAdapter(projAdapter);
currProj = allProjectLists.get(currProjList);
projName = currProj.getName();
goals = currProj.getProjects();
saveGoals();
}
else{
currProj = new ProjectList("Проект", new ArrayList());
allProjectLists.add(currProj);
projName = currProj.getName();
goals = currProj.getProjects();
saveData("ProjectsData", allProjectLists);
}
loadGoals();
addProj.setOnClickListener(v -> showAddProjectDialog());
leftArrow.setOnClickListener(v ->{
if (currProjList > 0){
currProjList--;
showCurrProj();
}
});
rightArrow.setOnClickListener(v ->{
if (currProjList < allProjectLists.size() -1){
currProjList++;
showCurrProj();
}
});
}
private void showCurrProj(){
if (!allProjectLists.isEmpty() && currProjList >= 0 && currProjList < allProjectLists.size()) {
currProj = allProjectLists.get(currProjList);
projName = currProj.getName();
goals = currProj.getProjects();
projAdapter = new ProjAdapter(this, Collections.singletonList(currProj), this);
projRecyclerView.setAdapter(projAdapter);
}
}
private void showAddProjectDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Add project list");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("Add", (dialog, which) -> {
String projectName = input.getText().toString();
if (!projectName.isEmpty()) {
currProj = new ProjectList(projectName, new ArrayList());
allProjectLists.add(currProj);
currProjList = allProjectLists.size() - 1;
showCurrProj();
saveData("ProjectsData", allProjectLists);
saveGoals();
if (goals == null) {
goals = new ArrayList();
}
currProj.setProjects(goals);
saveGoals();
}
});
builder.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel());
builder.show();
}
public void saveData(String key, Object data){
SharedPreferences sharedPreferences = getSharedPreferences(key, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(data);
editor.putString(hobbyName, json);
editor.apply();
}
private T loadData(String key, Type type){
SharedPreferences sharedPreferences = getSharedPreferences(key, Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString(hobbyName, null);
if (json != null){
try{
return gson.fromJson(json, type);
}
catch (JsonSyntaxException e){
e.printStackTrace();
return null;
}
}
return null;
}
public void saveGoals(){
Log.d("HobbyDetails", "Saving goals for project: " + projName + ", goals count: " + goals.size());
Log.d("SAVE_GOALS", "Saving " + goals.size() + " goals for: " + projName);
SharedPreferences prefs = getSharedPreferences("GoalsData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(goals);
editor.putString(projName, json);
editor.apply();
currProj.setProjects(goals);
}
private void loadGoals(){
Log.d("HobbyDetails", "Loading goals for project: " + projName);
SharedPreferences prefs = getSharedPreferences("GoalsData", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(projName, null);
Type type = new TypeToken() {}.getType();
if (json!= null){
goals = gson.fromJson(json, type);
Log.d("HobbyDetails", "Loaded " + goals.size() + " goals.");
}
else{
goals = new ArrayList();
}
currProj.setProjects(goals);
}
private void loadProjectLists() {
Type type = new TypeToken() {}.getType();
ArrayList loadedLists = loadData("ProjectsData", type);
allProjectLists = loadedLists != null ? loadedLists : new ArrayList();
}
@Override
public void onGoalsChanged(ArrayList goals) {
this.goals = goals;
saveGoals();
}
}
projAdapter(for the whole list):
public class ProjAdapter extends RecyclerView.Adapter {
private final List projectLists;
private final Context context;
private final LayoutInflater inflater;
private final onGoalsChangedListener listener;
public ProjAdapter(Context context, List projects, onGoalsChangedListener listener){
this.projectLists = projects;
this.listener = listener;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public ProjAdapter.ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.proj_item,parent,false);
return new ProjViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ProjAdapter.ProjViewHolder holder, int position) {
ProjectList projectList = projectLists.get(position);
holder.projectName.setText(projectList.getName());
ProjectAdapter projectAdapter = new ProjectAdapter(projectList.getProjects(), context, goals ->{
if (listener != null){
listener.onGoalsChanged(projectList.getProjects());
}
});
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
holder.goalRecyclerView.setLayoutManager(layoutManager);
holder.goalRecyclerView.setAdapter(projectAdapter);
holder.addButton.setOnClickListener(v ->
showAddProjectDialog(projectList, projectAdapter));
}
private void showAddProjectDialog(ProjectList projectList, ProjectAdapter projectAdapter){
AlertDialog.Builder builder= new AlertDialog.Builder(context);
View dialogView = inflater.inflate(R.layout.add_goal_dialog,null);
EditText projectInput = dialogView.findViewById(R.id.goalName);
ImageView ok = dialogView.findViewById(R.id.okGoal);
ImageView cancel = dialogView.findViewById(R.id.cancelGoal);
builder.setView(dialogView);
AlertDialog dialog = builder.create();
ok.setOnClickListener(v -> {
String projectText = projectInput.getText().toString().trim();
if(!projectText.isEmpty()){
Project newProject = new Project(projectText);
projectList.getProjects().add(newProject);
projectAdapter.notifyDataSetChanged();
if (listener != null){
listener.onGoalsChanged(projectList.getProjects());
}
}
dialog.dismiss();
});
cancel.setOnClickListener(v -> dialog.dismiss());
dialog.show();
}
@Override
public int getItemCount() {
return projectLists.size();
}
public static class ProjViewHolder extends RecyclerView.ViewHolder{
TextView projectName;
RecyclerView goalRecyclerView;
Button addButton;
ImageView list;
public ProjViewHolder(@NonNull View itemView) {
super(itemView);
projectName = itemView.findViewById(R.id.projectName);
goalRecyclerView = itemView.findViewById(R.id.projectRecyclerView);
addButton = itemView.findViewById(R.id.addGoal);
list = itemView.findViewById(R.id.projectsList);
}
}
public interface onGoalsChangedListener{
void onGoalsChanged(ArrayList goals);
}
}
ProjectAdapter(for goals):
public class ProjectAdapter extends RecyclerView.Adapter {
Context context;
ArrayList projects;
private final ProjAdapter.onGoalsChangedListener listener;
public ProjectAdapter(ArrayList projects, Context context, ProjAdapter.onGoalsChangedListener listener) {
this.projects = projects;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public ProjectAdapter.ProjectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.project_item, parent, false);
return new ProjectViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ProjectAdapter.ProjectViewHolder holder, int position) {
Project project = projects.get(position);
holder.projectCheckBox.setText(project.getProjectName());
holder.projectCheckBox.setOnCheckedChangeListener(null);
holder.projectCheckBox.setChecked(project.isCompleted());
holder.projectCheckBox.setOnCheckedChangeListener(((buttonView, isChecked) -> {
new Handler().post(() -> {
project.setCompleted(isChecked);
notifyItemChanged(position);
if (listener!= null){
listener.onGoalsChanged(projects);
}
/*((hobby_details) context).saveData("HobbyProjects", projects);*/
});
}));
}
@Override
public int getItemCount() {
return projects.size();
}
public static class ProjectViewHolder extends RecyclerView.ViewHolder{
CheckBox projectCheckBox;
public ProjectViewHolder(@NonNull View itemView) {
super(itemView);
projectCheckBox = itemView.findViewById(R.id.projectCheckBox);
}
}
}
Project class:
public class Project{
private final String projectName;
private boolean isCompleted;
public Project(String projectName) {
this.projectName = projectName;
this.isCompleted = false;
}
public String getProjectName() {
return projectName;
}
public boolean isCompleted() {
return isCompleted;
}
public void setCompleted(boolean completed) {
isCompleted = completed;
}
}
proj class:
public class ProjectList {
private String name;
private ArrayList projects;
public ProjectList(String name, ArrayList projects) {
this.name = name;
this.projects = projects;
}
public String getName() {
return name;
}
public ArrayList getProjects() {
return projects;
}
public void addProject(Project project){
projects.add(project);
}
public void setProjects(ArrayList projects) {
this.projects = projects;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79573035/cant-save-goals-to-the-recycler-view-in-project-lists[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия