AMcoder - javascript, python, java, html, php, sql

RecyclerView-ն արգելափակում է UI շարանը թարմացումների ժամանակ

Իմ ցուցակում կա ավելի քան 200 ապրանք: RecyclerView-ը պարբերաբար թարմացվում է (յուրաքանչյուր 10 վայրկյանը մեկ): RecyclerView-ը մի քանի վայրկյանով արգելափակում է UI շարանը թարմացումների ընթացքում: Ես օգտագործում եմ notifyDataSetChanged մեթոդը թարմացման վերամշակման դիտման համար: Կա՞ սառցակալումը կանխելու այլ միջոց: Ի դեպ, ես չեմ ուզում օգտագործել էջադրում:

Այս մեթոդը գործում է 10 վայրկյանը մեկ.

public void refreshAssetList(List<Asset> newAssetList){
     recyclerViewAdapter.setAssetList(newAssetList);
     recyclerViewAdapter.notifyDataSetChanged();
}

RecyclerViewAdapter դաս.

public class AssetListRecyclerViewAdapter extends RecyclerView.Adapter<AssetListRecyclerViewAdapter.BaseViewHolder> {

    private List<Asset> assetList;
    Context context;

    public AssetListRecyclerViewAdapter(List<Asset> assetList, Context context) {
        this.assetList = assetList;
        this.context = context;
    }

    public void setAssetList(List<Asset> assetList) {
        this.assetList = assetList;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_asset, null);
            return new DetailViewHolder(itemLayoutView);
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        Asset asset = assetList.get(position);
        Last last = asset.getLast();
        if (holder.getItemViewType() == TYPE_DETAIL) {
            DetailViewHolder mHolder = (DetailViewHolder) holder;
            mHolder.dateTextView.setText(last.getDate());
            mHolder.brandTextView.setText(asset.getMc());
        }
    }

     class DetailViewHolder extends BaseViewHolder {

        @Bind(R.id.brandTextV)
        TextView brandTextView;
        @Bind(R.id.dateTextV)
        TextView dateTextView;

         DetailViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            ButterKnife.bind(this, itemLayoutView);
        }
    }

}

  • կարո՞ղ եք այս մեթոդի կոդը տեղադրել ձեր հարցի մեջ: AssetListHelper.getAssetListByQuery(հարցում, համատեքստ); 25.04.2017
  • assetList-ը գլոբալ փոփոխական է ձեր գործունեության մեջ, ճիշտ է: 25.04.2017
  • այո assetList-ը գլոբալ փոփոխական է: Իսկ getAssetListByQuery մեթոդը կարևոր չէ: Հարցը թարմացնում եմ. 25.04.2017
  • Օգտագործեք recyclerViewAdapter.notifyItemChanged(դիրքը); 25.04.2017
  • @Ram Ես ուզում եմ թարմացնել բոլոր տարրերը: ոչ միայն կոնկրետ կետ. 25.04.2017
  • Ինչու՞ պետք է թարմացնեք բոլոր տարրը որևէ հատուկ պահանջ: 25.04.2017

Պատասխանները:


1

Դուք պետք չէ զանգահարել notifyDataSetChangedին, դա թանկ գործողություն է, որը ձեր ամբողջ RecyclerView-ն ամբողջությամբ կվերագծի, կվերակցի և այլն:

Ինչպես ասում է դոկտորը.

Այս իրադարձությունը չի հստակեցնում, թե ինչ է փոխվել տվյալների հավաքածուի մասին՝ ստիպելով դիտորդներին ենթադրել, որ գոյություն ունեցող բոլոր տարրերն ու կառուցվածքը կարող են այլևս վավեր չլինել: LayoutManagers-ը ստիպված կլինի ամբողջությամբ վերամիավորել և վերափոխել բոլոր տեսանելի դիտումները:

Ձեզ անհրաժեշտ է միայն շրջել յուրաքանչյուր դիրքի միջով և անհրաժեշտության դեպքում թարմացնել ցանկալի տարրը, այլապես ոչինչ չանել կամ բաց թողնել:

Ինչ պետք է անեք.

Քանի որ դուք թարմացնում եք ձեր ամբողջ տեսքը, նախ պետք է համեմատեք ձեր (տեսանելի) ադապտերի List<Asset>-ը նոր List<Asset>-ի հետ և առբերեք միայն այն տարրերը, որոնք դուք պետք է թարմացնեք, երբ ցուցակն անցկացնեք թարմացված ցուցակի միջոցով և թարմացնեք ձեր ադապտերի տեսքը՝ օգտագործելով viewAdapter.notifyItemChanged(position): .

25.04.2017
  • Շնորհակալություն մանրամասն պատասխանի համար։ Որոշ հետազոտություններից հետո ես գտա DiffUtil դասը փոփոխված տարրերը հայտնաբերելու համար: Նույնիսկ այսքան սառեցում դեռ գոյություն ունի: Նախքան DiffUtil 4 վայրկյան սառեցնել: Այժմ օգտագործելուց հետո DiffUtil դաս. սառեցման ժամանակը 2 վայրկյան է: Ավելի քիչ սառչում 2 վայրկյան: DiffUtil նմուշ նախագիծ՝ github.com/mrmike/DiffUtil-sample 25.04.2017
  • Լավ է, որ գտաք ձեր խնդրի հիմնական պատճառը: Այժմ սկսեք և ավարտեք տեսանելի տարրերի դիրքերը և թարմացրեք միայն այդ տարրերը, ոչինչ մի արեք մնացած դիտման տարրերի հետ և պարզապես թարմացրեք ձեր ադապտերի List<Asset>-ը նորով: Այս դեպքում դուք կթարմացնեք միայն տեսանելի տարրերը, և երբ ոլորեք վերև կամ վար, ձեր տեսքը կթարմացվի ըստ թարմացված ցանկի 25.04.2017

  • 2

    Կատարեք ադապտորը թարմացնելու գործողությունը հետևյալ կերպ.

    public void refreshAssetList(List<Asset> newAssetList){
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    recyclerViewAdapter.setAssetList(newAssetList);
                    recyclerViewAdapter.notifyDataSetChanged();
                }
            }); 
    }
    
    25.04.2017
  • @yusufonder Սա օգնե՞լ է ձեզ: 25.04.2017
  • Ի՞նչ է ստացվում: 25.04.2017
  • Ոչ մի փոփոխություն: Սառեցումը շարունակվում է. 25.04.2017
  • Արդյո՞ք խնդիրը շարունակական է, եթե չկարգավորեք և չթարմացնեք ադապտերը: Մեկ անգամ ստուգեք. 25.04.2017
  • Դա նշանակում է, որ սա սառեցման պատճառ չէ: Ստուգեք՝ արդյոք ձեր կողմից օգտագործվող վեբ ծառայությունն է առաջացնում: 25.04.2017
  • NotifyDataSetChanged մեթոդը հեռացնելիս չի սառչում: Այսպիսով, իմ խնդիրը կապված վեբ ծառայությունները չէ 25.04.2017
  • Եկեք շարունակենք այս քննարկումը զրուցարանում: 25.04.2017

  • 3

    Որոշ հետազոտություններից հետո ես գտա DiffUtil դասը ցուցակը թարմացնելու համար:

    Փաստաթղթերից՝

    DiffUtil-ը օգտակար դաս է, որը կարող է հաշվարկել երկու ցուցակների տարբերությունը և թողարկել թարմացման գործողությունների ցուցակ, որը առաջին ցուցակը վերածում է երկրորդի:

    DiffUtil-ին անհրաժեշտ է նոր ցուցակ և հին ցուցակ: Այն թարմացնում է միայն ցանկի փոփոխվող տարրերը: Ես ստեղծեցի AssetDiffUtil դասը հետևյալ կերպ.

    public class AssetDiffUtil extends DiffUtil.Callback {
    
        private final List<Asset> oldList;
        private final List<Asset> newList;
    
        public AssetDiffUtil(List<Asset> oldList, List<Asset> newList) {
            this.oldList = oldList;
            this.newList = newList;
        }
    
        @Override
        public int getOldListSize() {
            return oldList.size();
        }
    
        @Override
        public int getNewListSize() {
            return newList.size();
        }
    
        @Override
        public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
            return oldList.get(oldItemPosition).getId() == newList.get(newItemPosition).getId();
        }
    
        @Override
        public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
            final Last oldItem = oldList.get(oldItemPosition).getLast();
            final Last newItem = newList.get(newItemPosition).getLast();
            return oldItem.getDate().equals(newItem.getDate());
        }
    
        @Nullable
        @Override
        public Object getChangePayload(int oldItemPosition, int newItemPosition) {
            // Implement method if you're going to use ItemAnimator
            return super.getChangePayload(oldItemPosition, newItemPosition);
        }
    }
    

    Այնուհետև ես ավելացրի swapItems մեթոդը՝ ցուցակը թարմացնելու համար AssetListRecyclerViewAdapter դասում:

      public void swapItems(List<Asset> newAssetList) {
            final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AssetDiffUtil(this.assetList, newAssetList));
            this.assetList.clear();
            this.assetList.addAll(newAssetList);
            diffResult.dispatchUpdatesTo(this);
        }
    

    վերջ։ Բայց իմ խնդիրը դեռ կա։ Նախքան DiffUtil-ի սառեցման ժամանակը 4 վայրկյան օգտագործելը: Այժմ, DiffUtil-ն օգտագործելուց հետո սառեցման ժամանակը 2 վայրկյան է: Ցավոք սրտի, սա իմ խնդրի վերջնական լուծում չէ:

    26.04.2017

    4

    օգտագործեք notifyItemRangeChanged-ի փոխարեն notifyDataSetChanged, ինչպես նաև երբեմն, երբ օգտագործում եք առաջընթացի գծեր, ինչպիսիք են SpinKitView-ի գրադարանները, այն մեծացնում է սառեցման ժամանակը:

    loadMoreProgress.visibility = View.VISIBLE
                homeViewModel.latestBars.observe(viewLifecycleOwner, Observer {
                    latestBarTests.addAll(it)
                    latestBarsAdapter.notifyItemRangeChanged(
                        latestBarTests.size - it.size,
                        latestBarTests.size
                    )
                })
    
    23.02.2021
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..