Отображение нескольких типов объектов в Recyclerview - PullRequest
0 голосов
/ 23 апреля 2019

Я создаю приложение для Android. Магазин приложений в базе данных sqlite: тип питомца (например, собака, кошка, птица) и имя питомца. У меня есть две таблицы:

AnimalType.java

 @PrimaryKey(autoGenerate = true)
 int type_id;
 // Type of the animal (cat or dog or bird )
 String type_name;

AnimalName.java

@PrimaryKey(autoGenerate = true)
int name_id;
String animal_name;
// Animal type foreign key
int type_fk;

У меня проблема с отображением данных в программе восстановления. Проблема в том, что я не могу отсортировать или сгруппировать данные на основе объекта типа Pet. (Обратите внимание, что я создал модель POJO, чтобы получить и отобразить два разных объекта (animal_type и animal_name)) Это модель:

AnimalModel.java

public class AnimalModel {
   public String type_name;
   public String animal_name;
 }

Вот как я реализовал свой переработчик

AllAnimalAdapter.java

public class AllAnimalAdapter extends RecyclerView.Adapter<AllAnimalAdapter.MyViewHolder> {

Context mContext;
ArrayList<AnimalModel> animalModel_list;

public AllAnimalAdapter(Context context) {
    this.mContext = context;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_all_animals, viewGroup, false);
    MyViewHolder viewHolder = new MyViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    AnimalModel pos = animalModel_list.get(position);
    holder.tv_animalType_var.setText(pos.type_name);
    holder.tv_animalName_var.setText(pos.animal_name);


}

@Override
public int getItemCount() {
    if (animalModel_list == null) {
        return 0;
    } else return animalModel_list.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tv_animalType_var,tv_animalName_var;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        tv_animalType_var = itemView.findViewById(R.id.tv_animalType_xml);
        tv_animalName_var = itemView.findViewById(R.id.tv_petName_xml);
    }
}

public void setAnimalModel_list(ArrayList<AnimalModel> animalModel_list) {
    this.animalModel_list = animalModel_list;
    notifyDataSetChanged();
 }
}

item_all_animals.xml

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

<TextView
    android:id="@+id/tv_animalType_xml"
    android:padding="10dp"
    android:textStyle="bold"

    android:text="Animal type"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


<TextView
    android:id="@+id/tv_petName_xml"
    android:padding="10dp"
    android:text="Pet Name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

FragmentAllAnimal.java

public class FragmentAllAnimal extends Fragment {

RecyclerView rc_allAnimals_var;
AllAnimalAdapter adapter;
MainViewModel viewModel;


// Empty Constructor
public FragmentAllAnimal() {
}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable    ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_all_animal, container, false);
    viewModel = ViewModelProviders.of(this).get(MainViewModel.class);


    buildRecyclerView(view);
    setHasOptionsMenu(true);
    setUpViewModel_loadAnimalModel();


    return view;

}

// Building RecyclerView
private void buildRecyclerView(View view) {
    rc_allAnimals_var = view.findViewById(R.id.rc_allAnimals_xml);
    rc_allAnimals_var.setLayoutManager(new LinearLayoutManager(getActivity()));
    adapter = new AllAnimalAdapter(getActivity());
    rc_allAnimals_var.setAdapter(adapter);


}

// Query for animal Model
public void setUpViewModel_loadAnimalModel() {
    viewModel.get_TypeAndName().observe(this, new Observer<List<AnimalModel>>() {
        @Override
        public void onChanged(@Nullable List<AnimalModel> animalModels) {
            adapter.setAnimalModel_list((ArrayList<AnimalModel>) animalModels);
        }
    });


}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_add_animal_type, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_add_animal_type_xml:
            Intent i = new Intent(getContext(), AddNewAnimalType.class);
            startActivity(i);
            break;
        case R.id.menu_add_pet_name_xml:
            Intent ii = new Intent(getContext(), AddNewPetName.class);
            startActivity(ii);
            break;
    }
    return true;
}

}

Это фактический результат

Фактический результат изображения

Вот как я хочу отображать данные, я хочу отображать тип животного (например, Cat) в качестве заголовка и группировать данные на основе типа объекта.

Желаемый вывод

Желаемое выходное изображение

Это мое приложение на GitHub: https://github.com/Andre112234/Pets

1 Ответ

0 голосов
/ 23 апреля 2019

Вы должны использовать несколько представлений и их держателей и показывать их в зависимости от их положения в стеке повторов, например this

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