安卓片段和适配器



我有以下代码,它是一个具有回收器视图的片段,我有一个适配器,调试我的代码显示适配器在片段返回结果后被调用,尽管我正在创建适配器的实例并将其设置为回收器视图并在返回片段之前设置所需的结果。 有人可以帮助解释发生了什么吗 我是安卓新手,有点爪哇经验。

这是我的片段类:

package com.clowiz.ui.gallery;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.clowiz.MainActivity;
import com.clowiz.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;
import static android.app.Activity.RESULT_OK;
public class GalleryFragment extends Fragment {
public static final int ADD_UNIVERSITY_CODE = 1;
private GalleryViewModel galleryViewModel;
private UniversityViewModel universityViewModel;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_gallery, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
FloatingActionButton buttonAddUniversity = view.findViewById(R.id.button_add_university);
buttonAddUniversity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), AddUniversityActivity.class);
startActivityForResult(intent, ADD_UNIVERSITY_CODE);
}
});
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
final UniversityAdapter adapter = new UniversityAdapter();
recyclerView.setAdapter(adapter);
universityViewModel = ViewModelProviders.of(this).get(UniversityViewModel.class);
universityViewModel.getAllUniversities().observe(this, new Observer<List<University>>() {
@Override
public void onChanged(@Nullable List<University> unis) {
adapter.setUniversities(unis);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == ADD_UNIVERSITY_CODE && resultCode == RESULT_OK) {
String name = data.getStringExtra(AddUniversityActivity.EXTRA_NAME);
University uni = new University(name);
universityViewModel.insert(uni);
Toast.makeText(getContext(), "uni added successfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getContext(), "uni not saved", Toast.LENGTH_SHORT).show();
}
}
}

这是我的适配器:

package com.clowiz.ui.gallery;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.clowiz.R;
import java.util.ArrayList;
import java.util.List;
public class UniversityAdapter extends RecyclerView.Adapter<UniversityAdapter.UniversityHolder> {
private List<University> universities = new ArrayList<>();
@NonNull
@Override
public UniversityHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.university_item, parent, false);
return new UniversityHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull UniversityHolder holder, int position) {
University university = universities.get(position);
holder.textViewId.setText(String.valueOf(university.getId()));
holder.textViewName.setText(university.getName());
}
@Override
public int getItemCount() {
return universities.size();
}
public void setUniversities(List<University> universities) {
this.universities = universities;
notifyDataSetChanged();
}
class UniversityHolder extends RecyclerView.ViewHolder {
private TextView textViewId;
private TextView textViewName;
public UniversityHolder(View itemView) {
super(itemView);
textViewId = itemView.findViewById(R.id.text_view_id);
textViewName = itemView.findViewById(R.id.text_view_name);
}
}
}

这是我的观点模型:

package com.clowiz.ui.gallery;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import java.util.List;
public class UniversityViewModel extends AndroidViewModel {
private UniversityRepository repository;
private LiveData<List<University>> allUniversities;
public UniversityViewModel(@NonNull Application application) {
super(application);
repository = new UniversityRepository(application);
allUniversities = repository.getAllUniversities();
}
public void insert(University university) {
repository.insert(university);
}
public void update(University university) {
repository.update(university);
}
public void delete(University university) {
repository.delete(university);
}
public LiveData<List<University>> getAllUniversities() {
return allUniversities;
}
}

这是我的列表项:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023">
<TextView
android:id="@+id/text_view_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:text="Id"
android:textAppearance="@style/TextAppearance.AppCompat.Large"></TextView>
<TextView
android:id="@+id/text_view_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_toStartOf="@id/text_view_id"
android:layout_toLeftOf="@id/text_view_id"
android:text="Name"
android:textAppearance="@style/TextAppearance.AppCompat.Large"></TextView>
</RelativeLayout>

</LinearLayout>

这是我的片段视图:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="159dp"
tools:layout_editor_absoluteY="182dp"
tools:listitem="@layout/university_item">
</androidx.recyclerview.widget.RecyclerView>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/button_add_university"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_add_black_24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.21"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.916"  />

</androidx.constraintlayout.widget.ConstraintLayout>

这是我的存储库:

包装com.clowiz.ui.gallery;

public class UniversityViewModel extends AndroidViewModel {
private UniversityRepository repository;
private LiveData<List<University>> allUniversities;
public UniversityViewModel(@NonNull Application application) {
super(application);
repository = new UniversityRepository(application);
allUniversities = repository.getAllUniversities();
}
public void insert(University university) {
repository.insert(university);
}
public void update(University university) {
repository.update(university);
}
public void delete(University university) {
repository.delete(university);
}
public LiveData<List<University>> getAllUniversities() {
return allUniversities;
}
}

如果你想有正确的设计,你应该把所有的代码移到onViewCreated,并保持onCreateView简单,如:

public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_gallery, container, false);
}

编辑:另外,提供RecyclerViewLayoutManager,因为我在初次阅读时错过了。

然后,您可以使用onViewCreatedview实例来获取其他视图。

您的问题是,一旦打开片段,默认情况下会显示Uni的列表。 当您使用浮动按钮单击添加新的Uni时,您会转到"AddUniversityActivity",并期望当您返回时看到添加的新Uni没有重复或奇怪的行为。

这是我认为你应该做的:

1(在类University上覆盖|impelment哈希码以使每个实例唯一(可以使用大学ID(。

2(使用HashSet作为大学的集合,而不是列表。

既然你正在学习,那就看看可观察的设计模式、活动生命周期、Fragmnet生命周期。

最新更新