элементы и категории с помощью FirestoreRecyclerAdapter - PullRequest
0 голосов
/ 26 сентября 2018

поэтому я хочу создать что-то вроде этого: пример

как при создании списка элементов, разделенных по категориям (у меня есть класс Item, который содержит категорию каждого элемента)

Мне удалось создать его с помощью arrayAdapter, вот код:

public class ItemAdapter  {


ArrayList<Object> list;
private static final int ITEM = 0;
private static final int HEADER = 1;
private ArrayList<Category> categories;
private boolean whiteBg = true;

public ItemAdapter(Context context , ArrayList<Object> list) {
    super(context , list);
    this.list = list;
    categories = new ArrayList<>();
}

@Override
public int getItemViewType(int position){
    if(list.get(position) instanceof Item){
        return ITEM;
    }
    else{
        return HEADER;
    }
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
   if (view == null){
       switch (getItemViewType(i)){
           case ITEM:
               view = LayoutInflater.from(getContext()).inflate(R.layout.item_list_view, viewGroup, false);
               break;
           case HEADER:
               view = LayoutInflater.from(getContext()).inflate(R.layout.item_list_view_header, viewGroup, false);
               break;
       }
   }
   switch (getItemViewType(i)){
       case ITEM:
           Item item = ((Item) list.get(i));
           String category = item.getCategory();
               TextView name = (TextView) view.findViewById(R.id.itemNameTextView);
               TextView quantity = (TextView) view.findViewById(R.id.itemNameTextView2);
               name.setText(item.getName());
               quantity.setText("quantity: " + item.getQuantity());
               if(whiteBg){
                   name.setBackgroundColor(Resources.getSystem().getColor(android.R.color.white));
                   quantity.setBackgroundColor(Resources.getSystem().getColor(android.R.color.white));
                   whiteBg = false;
               }
               else{
                   name.setBackgroundColor(Resources.getSystem().getColor(android.R.color.darker_gray));
                   quantity.setBackgroundColor(Resources.getSystem().getColor(android.R.color.darker_gray));
                   whiteBg = true;
               }

           break;
       case HEADER:
           TextView title = (TextView) view.findViewById(R.id.itemListViewHeader);
           title.setText(((String)list.get(i)));
           break;

   }
   return view;
}

@Override
public void remove(@Nullable Object object) {
    super.remove(object);
    if(object instanceof Item) {
        categoryCheckDown(((Item) object).getCategory());
    }

}


public boolean categoryExistsInc(String catName){
    if(categories.size() == 0){
        categories.add(new Category(catName , 1));
        return false;
    }
    for(Category it: categories){
        if(it.getName().equals(catName)){
            it.amountUp();
            return true;
        }
    }
    categories.add(new Category(catName , 1));
    return false;
}

public boolean categoryCheckDown(String catName){
    for(Category it: categories){
        if(it.getName().equals(catName)){
            it.amountDown();
            if(it.getAmount() == 0){
                categories.remove(it);
                super.remove(catName);
                return true;
            }

        }
    }
    return false;
}

public boolean categoryExists(String catName){
    if(categories.size() == 0){
        return false;
    }
    for(Category it: categories) {
        if (it.getName().equals(catName)) {
            return true;
        }
    }
    return false;
}

@Override
public void clear() {
    super.clear();
    categories.clear();
}

@Override
public void add(@Nullable Object object) {
    if (object instanceof Item) {
        super.add(object);
        return;
    }
    else{
        if(categoryExistsInc((String) object)){
           return;
        }
        else{
            super.add(object);
            return;
        }

    }
}

, но я изменил дизайн приложения, и теперь я использую recycleView, адаптер - FirestoreRecyclerAdapter.элементы отображаются очень хорошо, но я не могу понять, как добавить категории.код соответствующего viewHolder:

public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

Item item;
Context context;

TextView name;
TextView quantity;

private View mView;
FragmentManager fragmentManager;


public ItemViewHolder(View itemView){
    super(itemView);

    this.name = itemView.findViewById(R.id.itemNameTextView);
    this.quantity = itemView.findViewById(R.id.quantityTextView);
    mView = itemView;

    itemView.setOnClickListener(this);
}

public void setItem(Context context , String userEmail , ShoppingList shoppingList, Item item , FragmentManager fragmentManager){
    String quantity = String.format("quantity: %d" , item.getQuantity());
    this.context = context;
    this.item = item;
    this.name.setText(item.getName());
    this.quantity.setText(quantity);
    this.fragmentManager = fragmentManager;
}

@Override
public void onClick(View view) {
    goToEdit();

    Toast.makeText(context, "CLACK", Toast.LENGTH_SHORT).show();
}

private void goToEdit() {
    EditFragment editFragment = new EditFragment();
    Bundle bundle = new Bundle();
    Item item = this.item;
    bundle.putSerializable("item", item);
    editFragment.setArguments(bundle);
    fragmentManager.beginTransaction().add(R.id.drawer , editFragment , "frag2").addToBackStack("what").commit();
}

}

предложения?Я предполагал создать новый адаптер, который расширяет FirestoreRecyclerAdapter, и переопределить некоторые методы, так же, как я делал с первыми адаптерами ... но я не могу выяснить из документации, какие из них.

...