Адаптер RecyclerView - элемент нижнего колонтитула открывает новый RecyclerView - PullRequest
0 голосов
/ 06 марта 2019

Я создаю приложение, которое позволяет пользователям добавлять «карточки активности» в расписание во время создания расписания.

  1. My footeritem находится в адаптере RecyclerView, который называется HFAdapter. Этот адаптер входит в мой класс «Расписание».
  2. Когда пользователь нажимает «добавить карту активности» в нижнем колонтитуле , я хочу, чтобы представление переработчика класса CardLibrary открывалось в диалоговом окне . Мой класс CardLibrary представляет собой отдельное действие для Android и имеет собственный адаптер для повторного просмотра с именем LibraryArrAdapter с 3 столбцами. Он отображает все карты в базе данных SQLite. Причина, по которой я создал новый LibraryArrAdapter в своем классе HFAdapter, заключается в том, что я хочу изменить количество столбцов на 2.
  3. Как только пользователь выбирает карточку в диалоге , диалоговое окно закрывается и карточка появляется в расписании .
  4. Мой LibraryArrAdapter работает отлично, так как он дает мне результаты, которые я хочу получить для своего класса CardLibrary.
  5. Все карточки пользователя хранятся в базе данных SQLite со столбцами для заголовка, изображения и Activity_duration. Но я просто хочу отобразить заголовок и изображение в моем классе «Расписание».
  6. Мой класс 'Schedule' все еще является новым занятием, и я ничего с ним не сделал, поэтому я не включил его коды классов ниже.

В классе HFAdapter у меня уже есть объект 'card' (экземпляр CardListItem), в котором хранится заголовок и изображение карты, выбранной пользователем в диалоговом окне, в конструкторе MyViewHolder. Как мне добавить этот объект карты в ArrayList и сделать так, чтобы нижний колонтитул всегда оставался последним элементом в ArrayList? Я делаю это в классе HFAdapter?

Чтобы получить элемент нижнего колонтитула в адаптере, мои методы и классы в основном основаны на https://demonuts.com/android-recyclerview-with-header-and-footer/.

Я действительно надеюсь получить некоторую помощь, так как потратил слишком много дней на это.

Класс HFAdapter:

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

RecyclerView recyclerView;

public static final int Normal = 1;
public static final int Footer = 2;

private LayoutInflater inflater;
private ArrayList<CardListItem> cardItemArrayList;
CardListItem card;

DatabaseHelper dbHelper;
SQLiteDatabase db;
Context context;
Cursor cursor;
byte[] image;

public HFAdapter(Context context, ArrayList<CardListItem> cardItemArrayList){
    inflater = LayoutInflater.from(context);
    this.cardItemArrayList = cardItemArrayList;
}

class MyViewHolder extends RecyclerView.ViewHolder
{
    TextView cardTitle;
    ImageView imageView;
    LinearLayout list_item,add_card;

    public MyViewHolder(View itemView, int viewType) {
        super(itemView);

        if(viewType == Normal) {
            cardTitle = itemView.findViewById(R.id.activity_title);
            imageView = itemView.findViewById(R.id.imgView);
            list_item = itemView.findViewById(R.id.schedule_list_item);
        }else if(viewType == Footer){
            add_card = itemView.findViewById(R.id.add_card);
            add_card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CardLibrary cardLib = new CardLibrary();
                    Dialog dialog = new Dialog(context);
                    dialog.setContentView(R.layout.activity_card_library);
                    recyclerView = dialog.findViewById(R.id.myRecyclerView);
                    int numberOfColumns = 2;
                    recyclerView.setLayoutManager(new GridLayoutManager(context, numberOfColumns));
                    LibraryArrAdapter adapter = new LibraryArrAdapter(context,cardLib.getAllCards());
                    recyclerView.setAdapter(adapter);
                    dialog.show();
                    final Dialog thisDialog = dialog;
                    LinearLayout a_card = recyclerView.findViewById(R.id.single_card);
                    dbHelper = new DatabaseHelper(context);
                    db = dbHelper.getReadableDatabase();
                    a_card.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            TextView txtvw_title = recyclerView.findViewById(R.id.item_title);
                            String title = txtvw_title.getText().toString();
                            cursor = db.rawQuery("SELECT image WHERE title=?",new String[]{title});
                            if(cursor.getCount()>0) {
                                cursor.moveToFirst();
                                image = cursor.getBlob(cursor.getColumnIndex(DatabaseHelper.COLUMN_IMAGE));
                            }
                            card = new CardListItem(title,image);
                            thisDialog.dismiss();
                        }
                    });
                }
            });
        }
    }
}

public void addCard(CardListItem card){
    cardItemArrayList.add(card);
    this.notifyDataSetChanged();
}



@Override
public int getItemViewType(int position) {
    if(cardItemArrayList.get(position).getViewType().equals("footer")){
        return Footer;
    }else {
        return Normal;
    }
}

@NonNull
@Override
public HFAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view ;
    MyViewHolder holder;

    switch (viewType){
        case Normal:
            view = inflater.inflate(R.layout.schedule_row_layout, parent, false);
            holder = new MyViewHolder(view , Normal);
            break;

        case Footer:
            view = inflater.inflate(R.layout.blank_row_layout, parent, false);
            holder = new MyViewHolder(view , Footer);
            break;

        default:
            view = inflater.inflate(R.layout.blank_row_layout, parent, false);
            holder = new MyViewHolder(view , Normal);
            break;
    }
    return holder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    if(cardItemArrayList.get(position).getViewType().equals("normal")) {
        holder.cardTitle.setText(card.getTitle());
        holder.imageView.setImageBitmap(card.getImage());
    }//cardItemArrayList.get(position)
}

@Override
public int getItemCount() {
    return cardItemArrayList.size();
}
}

Класс CardListItem: (для 1 элемента в HFAdapter Arraylist)

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class CardListItem {

String title;
byte[] image;
String viewType;

public CardListItem(String activityName, byte[] image){
    this.title = activityName;
    this.image = image;
}

public String getViewType(){
    return viewType;
}

public void setViewType(String viewType){
    this.viewType = viewType;
}

public String getTitle() {
    return title;
}

public void setTitle(String text) {
    this.title = text;
}

public Bitmap getImage(){
    Bitmap b = BitmapFactory.decodeByteArray(image,0,image.length);
    return b;
}

public void setImage(byte[] image) {
    this.image = image;
}
}

Заранее большое спасибо!

...