RecyclerView показывает элемент только при редактировании следующего элемента, который будет добавлен - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время я создаю активность в своем приложении, где продукты добавляются с использованием FAB. При нажатии FAB открывается новое всплывающее действие с startActivityForResult, и в нем форма заполняется и отправляется обратно через объект Parcelable.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что после добавления продукта он не отображается в RecyclerView, но когда я снова нажимаю FAB, во-вторых, я начинаю редактировать любое поле внутри формы (например, любой EditText ) к следующему продукту, я вижу предыдущий, появляющийся на заднем плане позади моей всплывающей формы. Когда я закончу второй продукт, он не появится, пока я не начну редактировать третий и т. Д.

Я просмотрел XML, и мне кажется, что все в порядке ... И попытался прочитать несколько решений (и мой код снова и снова), но ни одно из них не помогло.

Соответствующие фрагменты кода (я положил ... где я пренебрег некоторым кодом, который не имеет отношения к этому случаю): Из основного вида деятельности (в нем должны быть показаны продукты):

'' '

public class EditOffersActivity extends AppCompatActivity {
    ...
    private ArrayList<Offer> offers_list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_products);
        offers_list = new ArrayList<>();

        ...

        RecyclerView rvOffers = findViewById(R.id.offers_RecyclerView);
        OfferAdapter adapter = new OfferAdapter(offers_list);
        rvOffers.setAdapter(adapter);
        rvOffers.setLayoutManager( new LinearLayoutManager(this));

        // Setting up the FAB so it leads to the Product Details Pop-up
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(EditOffersActivity.this, ProductDetailsPopupActivity.class);
                startActivityForResult(intent, HTZ_ADD_OFFER); // HTZ_ADD_OFFER = 1
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Offer created_offer = data.getParcelableExtra("offer");
        offers_list.add(created_offer);
    }
}

'' '

Адаптер: '' '

public class OfferAdapter extends android.support.v7.widget.RecyclerView.Adapter<OfferAdapter.OfferViewholder> {
    private ArrayList<Offer> mOffers;

    public OfferAdapter(ArrayList<Offer> offers) {
        mOffers = offers;
    }

    @Override
    public OfferViewholder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        Context context = viewGroup.getContext();
        int layoutIdForListItem = R.layout.item_product;
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(layoutIdForListItem, viewGroup, false);
        OfferViewholder viewHolder = new OfferViewholder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(OfferViewholder holder, int position) {
        Offer current_offer = mOffers.get(position);
        ... // a lot of binding code
    }


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

    class OfferViewholder extends RecyclerView.ViewHolder {
        TextView name_TextView;
        TextView time_TextView;
        ...

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

            // Init all views
            name_TextView = itemView.findViewById(R.id.product_item_name_TextView);
            time_TextView = itemView.findViewById(R.id.product_item_time_TextView);
             ...

        }
    }
}

'' '

И часть всплывающего окна, которое закрывает его после того, как пользователь нажимает «Готово»: '' '

mPublishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(p_photo_url == null) {
                ...
                } else {

                    // Create offer from user input
                    Offer n_offer = new Offer   (...)
                    );

                    ...

                    // Return offer to EditOffersActivity
                    Intent resultIntent = new Intent();
                    resultIntent.putExtra("offer", n_offer); // Offer is Parcelable
                    setResult(HTZ_ADD_OFFER, resultIntent);
                    finish();
                }
            }
        });

'' '

И XML RecyclerView:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/offers_RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
    tools:itemCount="3"
    tools:listitem="@layout/item_product"
    tools:orientation="vertical"
    tools:scrollbars="horizontal"
    tools:spanCount="1">

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Вы можете использовать notifydatasetchanged, как показано ниже:

mPublishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(p_photo_url == null) {
                ...
                } else {

                    // Create offer from user input
                    Offer n_offer = new Offer   (...)
                    );

                    ...

                    // Return offer to EditOffersActivity
                    Intent resultIntent = new Intent();
                    resultIntent.putExtra("offer", n_offer); // Offer is Parcelable
                    setResult(HTZ_ADD_OFFER, resultIntent);
                    OfferAdapter.notifydatasetchanged();
                    finish();
                }
            }
        });

OfferAdapter.notifydatasetchanged (); // метод обновит адаптер, установленный в вашем представлении. и значения будут обновлены.

Не забудьте оценить и полюбить ответ.

1 голос
/ 17 апреля 2019

Добавьте метод на свой адаптер следующим образом:

public void update(ArrayList<Offer> offers){
            mOffers = offers;
        }

Обновите свой onActivityResult и уведомите адаптер следующим образом:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Offer created_offer = data.getParcelableExtra("offer");
        offers_list.add(created_offer);
        adpater.update(offers_list);
        adapter.notifydatasetchanged();
    }
0 голосов
/ 17 апреля 2019

после добавления в ArrayList Вы должны уведомить об изменениях в Adapter, вызвав RecyclerViewAdapter's notifydatasetchanged ()

like:

adapter.notifydatasetchanged ()

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