Как обновить данные адаптера RecyclerView при добавлении нового элемента в список - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над функциональностью, в которой я добавил FooterView в свой RecyclerView.Я добавляю новый элемент в список, нажимая значок «+» в FooterView.Элемент успешно добавлен в ArrayList из фрагмента, а данные добавлены в локальную базу данных, но новый элемент списка не добавлен в список, так как адаптер не может обновляться одновременно.Когда я перехожу на другой экран, затем возвращаюсь к этому экрану, тогда я могу видеть элемент.Я пытался сделать, но не смог сделать это.

Код для адаптера: `открытый класс RecyclerViewAdapter расширяет RecyclerView.Adapter {

private static final int TYPE_HEADER = 0;
private static final int TYPE_FOOTER = 1;
private static final int TYPE_ITEM = 2;


private Activity activity;

ArrayList<ModelUnrecognisedCode> modelUnrecognisedCodesArrayList;
FinalizePreOrde finalizePreOrderFragment;
ModelUnrecognisedCode modelUnrecognisedCode;

public RecyclerViewAdapter(Activity activity, ArrayList<ModelUnrecognisedCode> modelUnrecognisedCodesArrayList, FinalizePreOrde finalizePreOrderFragment) {
    this.activity = activity;
    this.modelUnrecognisedCodesArrayList = modelUnrecognisedCodesArrayList;
    this.finalizePreOrderFragment = finalizePreOrderFragment;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_ITEM) {
        //Inflating recycle view item layout
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_unrecognised_item, parent, false);
        return new ItemViewHolder(itemView);
    } else if (viewType == TYPE_FOOTER) {
        //Inflating footer view
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_view, parent, false);
        return new FooterViewHolder(itemView);
    } else return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {


    if (holder instanceof FooterViewHolder) {
        final FooterViewHolder footerHolder = (FooterViewHolder) holder;

        footerHolder.imgAddMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                finalizePreOrderFragment.addView(footerHolder.etCode.getText().toString(), position);

            }
        });


    } else if (holder instanceof ItemViewHolder) {
        final ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
        modelUnrecognisedCode = modelUnrecognisedCodesArrayList.get(position);
        itemViewHolder.etCode.setText(modelUnrecognisedCode.getUnrecognised_code());


    }
}

@Override
public int getItemViewType(int position) {
    if (position == modelUnrecognisedCodesArrayList.size()) {
        return TYPE_FOOTER;
    }
    return TYPE_ITEM;
}

@Override
public int getItemCount() {
    return modelUnrecognisedCodesArrayList.size() + 1;
}

`

внутри BindView Holder внутриРаздел нижнего колонтитула Я добавил код, чтобы нажать на значок «+» и добавить новый элемент в список

footerHolder.imgAddMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                finalizePreOrderFragment.addView(footerHolder.etCode.getText().toString(), position);

            }
        });

И теперь мой код фрагмента для добавления нового

 public void addView(String code, int position) {
    ModelUnrecognisedCode modelUnrecognisedCode = new ModelUnrecognisedCode();
    modelUnrecognisedCode.setUnrecognised_code(code);
    modelUnrecognisedCode.setUnrecognised_comment("comment");
    modelUnrecognisedCode.setShop_id("1");
    modelUnrecognisedCode.setShop_name_fr("fr");
    modelUnrecognisedCode.setShop_name_nl("nl");
    databaseHelper.addUnrecognisedCode(modelUnrecognisedCode);
    modelUnrecognisedCodesArrayList = databaseHelper.getUnrecognisedCode();

    adapterUnrecognisedCode.notifyItemInserted(position);
    adapterUnrecognisedCode.notifyItemRangeChanged(position, modelUnrecognisedCodesArrayList.size());
    adapterUnrecognisedCode.notifyDataSetChanged();

    Log.e("TAG", "unrecognised code: " + modelUnrecognisedCodesArrayList.size());
}

Я могудобавить элемент в ArrayList, но адаптер не обновляется, когда я нажимаю назад, а затем возвращаюсь снова, тогда я могу видеть элемент.Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Если я получаю ваш вопрос, вы не добавляете новый элемент в список. Добавьте новый добавленный элемент в список, а затем уведомите об этом.

modelUnrecognisedCodesArrayList .add (modelUnrecognisedCode);

 public void addView(String code, int position) {
        ModelUnrecognisedCode modelUnrecognisedCode = new ModelUnrecognisedCode();
        modelUnrecognisedCode.setUnrecognised_code(code);
        modelUnrecognisedCode.setUnrecognised_comment("comment");
        modelUnrecognisedCode.setShop_id("1");
        modelUnrecognisedCode.setShop_name_fr("fr");
        modelUnrecognisedCode.setShop_name_nl("nl");
        databaseHelper.addUnrecognisedCode(modelUnrecognisedCode);
        modelUnrecognisedCodesArrayList = databaseHelper.getUnrecognisedCode();

      modelUnrecognisedCodesArrayList .add(modelUnrecognisedCode);

      adapterUnrecognisedCode.notifyItemInserted(position);
        adapterUnrecognisedCode.notifyItemRangeChanged(position, 
     modelUnrecognisedCodesArrayList.size());
        adapterUnrecognisedCode.notifyDataSetChanged();

        Log.e("TAG", "unrecognised code: " + modelUnrecognisedCodesArrayList.size());
    }
0 голосов
/ 12 сентября 2018

Попробуйте очистить свой список, снова добавить все элементы и затем уведомить об изменении.Как то так:

list.clear()
list.addAll(yourUpdatedList)
adapter.notifyDataSetChanged()
0 голосов
/ 12 сентября 2018

Вы пробовали: RecyclerView.adapter.notifyDataSetChanged() У меня сработало, что обновляет ваш RecyclerView напрямую

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