Получение Android RecyclerView для обновления представления внутри компонента React Native

Я делаю мобильное приложение с использованием React Native, и включенные компоненты списка не имеют достаточно высокой производительности для него, поэтому я начал использовать Android RecyclerView в качестве компонента списка. Хотя с этим есть проблема. RecyclerView не обновляет представления своего содержимого, пока я не прокрутлю или не изменю размер RecyclerView. Что может вызвать эту проблему и как я могу это исправить? Я пробовал notifyDatasetChanged, notifyItemChanged, forceLayout, invalidate, postInvalidate и множество различных вариантов каждого из них.


person Vaintti    schedule 07.09.2017    source источник
comment
Flatlist не соответствует вашим требованиям, и вы видели эту страницу facebook. github.io/react-native/docs/? Flatlist наследуется от virtualizedlist, попробуйте сделать ваши data элементы PureComponent   -  person eden    schedule 17.09.2017
comment
Я пытался использовать плоский список, но его производительность недостаточно хороша для моей цели. Он становится довольно медленным при использовании данных из тысяч элементов.   -  person Vaintti    schedule 18.09.2017
comment
Пробовали ли вы сделать элементы списка Pure Component?   -  person eden    schedule 18.09.2017
comment
Да. Это не помогло достаточно.   -  person Vaintti    schedule 21.09.2017
comment
Ты понял это, мой друг? Я в точно такой же ситуации!   -  person SudoPlz    schedule 20.03.2018
comment
@SudoPlz У меня та же проблема, RecyclerView где-то в SimpleViewManager. Он не обновляется, пока я не прокручиваю. Вы поняли это?   -  person Florian Cargoet    schedule 04.04.2018
comment
@SudoPlz Я нашел ваше решение: stackoverflow.com/questions/49371866/   -  person Florian Cargoet    schedule 04.04.2018


Ответы (1)


введите здесь описание изображенияПопробуйте это this.setIsRecyclable(true);

Это будет ссылаться на ваши взгляды

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ArrayList<String> mSingleItemLists = new ArrayList<>();
    private SingleListItemAdapter mSingleListItemAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_single_item);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        setDummyData();
    }

    private void setDummyData() {
        for (int i = 0; i <= 30; i++)
            mSingleItemLists.add("item" + i);
    }


    @Override
    protected void onResume() {
        super.onResume();
        mSingleListItemAdapter = new SingleListItemAdapter(mSingleItemLists);
        mRecyclerView.setAdapter(mSingleListItemAdapter);
    }

    class SingleListItemAdapter extends RecyclerView.Adapter<SingleListItemAdapter.SingleListItemHolder> {
        private ArrayList<String> mSingleItemLists;

        private SingleListItemAdapter(ArrayList<String> singleItemLists) {
            mSingleItemLists = singleItemLists;
            //You can do notifydatasetchange if u r having any saved value 
        }

        @Override
        public SingleListItemAdapter.SingleListItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View inflatedView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_recyclerview, parent, false);
            return new SingleListItemHolder(inflatedView);
        }

        @Override
        public void onBindViewHolder(SingleListItemAdapter.SingleListItemHolder holder, int position) {
            holder.mItemDate.setText(mSingleItemLists.get(position));
        }

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

        class SingleListItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            private TextView mItemDate;

            SingleListItemHolder(View v) {
                super(v);
                mItemDate = (TextView) v.findViewById(R.id.textview_recycler_list_item);
                v.setOnClickListener(this);
                this.setIsRecyclable(true); // This will help u 
            }

            @Override
            public void onClick(View v) {
                //do your stuff
                notifyDataSetChanged();
            }
        }
    }

}
person Amjad Khan    schedule 20.09.2017
comment
Я попытался добавить this.setIsRecycleable(true) ко всем моим ViewHolder, но, к сожалению, это не привело к обновлению моих представлений. - person Vaintti; 21.09.2017
comment
mSingleListItemAdapter = новый адаптер SingleListItem(mSingleItemLists); mRecyclerView.setAdapter (mSingleListItemAdapter); Попробуйте установить это снова, где вы хотите сослаться - person Amjad Khan; 21.09.2017
comment
Это не работает в первый раз, когда обновляется представление и вызывает переход к началу списка и тому подобное. - person Vaintti; 22.09.2017
comment
Я добавил изображение, также вы можете проверить - person Amjad Khan; 23.09.2017