8

React Nativeを使用してモバイルアプリケーションを作成しています。含まれているリストコンポーネントのパフォーマンスが十分ではなかったため、AndroidのRecyclerViewをリストコンポーネントとして使用しました。それでも問題はあります。 RecyclerViewは、RecyclerViewのサイズをスクロールまたは変更するまで、コンテンツビューを更新しません。何が原因でこの問題が発生し、どのように修正できますか?私は、notifyDatasetChanged、notifyItemChanged、forceLayout、invalidate、postInvalidate、およびそれぞれにさまざまなバリエーションを試しました。Android RecyclerViewを使用してReactネイティブコンポーネント内のビューを更新する

+0

あなたの要件を満たすflatlistではなく、あなたがこのページを見ていますhttps://facebook.github.io/react- native/docs/virtualizedlist.html#virtualizedlist?フラットリストは仮想化リストから継承し、あなたの 'data'アイテムを作ろうPureComponent – eden

+0

私はフラットリストを使用しようとしましたが、その性能は私の目的には十分ではありません。何千ものアイテムのデータで使用するとかなり遅くなります。 – Vaintti

+0

リストアイテムを純粋なコンポーネントにしようとしましたか? – eden

答えて

1

enter image description hereこれは1 this.setIsRecyclable(true);

それはあなたの意見をrefereshます試してみてください

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(); 
      } 
     } 
    } 

} 
+0

私はthis.setIsRecycleable(true)をすべてのViewHoldersに追加しようとしましたが、残念ながらビューをリフレッシュさせることはありませんでした。 – Vaintti

+0

mSingleListItemAdapter = new SingleListItemAdapter(mSingleItemLists); mRecyclerView.setAdapter(mSingleListItemAdapter); –

+0

これは、ビューが更新されて初めて動作しないため、リストの先頭などにジャンプする原因となります。 – Vaintti

関連する問題