পুনর্নবীকরণভিউ বিজ্ঞপ্তির পরে ঝলকান


113

আমার একটি পুনর্ব্যবহারযোগ্য ভিউ রয়েছে যা এপিআই থেকে কিছু ডেটা লোড করে, একটি চিত্রের ইউআরএল এবং কিছু ডেটা অন্তর্ভুক্ত করে, এবং আমি অলস লোড ইমেজের জন্য নেটওয়ার্ক আইমেজভিউ ব্যবহার করি।

@Override
public void onResponse(List<Item> response) {
   mItems.clear();
   for (Item item : response) {
      mItems.add(item);
   }
   mAdapter.notifyDataSetChanged();
   mSwipeRefreshLayout.setRefreshing(false);
}

অ্যাডাপ্টারের জন্য এখানে বাস্তবায়ন:

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
        if (isHeader(position)) {
            return;
        }
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        MyViewHolder holder = (MyViewHolder) viewHolder;
        final Item item = mItems.get(position - 1); // Subtract 1 for header
        holder.title.setText(item.getTitle());
        holder.image.setImageUrl(item.getImg_url(), VolleyClient.getInstance(mCtx).getImageLoader());
        holder.image.setErrorImageResId(android.R.drawable.ic_dialog_alert);
        holder.origin.setText(item.getOrigin());
    }

সমস্যাটি যখন আমরা রিসাইক্লার ভিউতে রিফ্রেশ করি তখন শুরুর দিকে খুব অল্প সময়ের জন্য এটি জ্বলজ্বলে হয় যা দেখতে অদ্ভুত লাগে।

আমি পরিবর্তে গ্রিডভিউ / তালিকাভিউ ব্যবহার করেছি এবং এটি আমার প্রত্যাশা অনুযায়ী কাজ করেছে। কোন ঝলক ছিল না।

রিসাইক্ল ভিউয়ের জন্য কনফিগারেশন এতে onViewCreated of my Fragment:

mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        mGridLayoutManager = (GridLayoutManager) mRecyclerView.getLayoutManager();
        mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return mAdapter.isHeader(position) ? mGridLayoutManager.getSpanCount() : 1;
            }
        });

        mRecyclerView.setAdapter(mAdapter);

কেউ কি এমন সমস্যার মুখোমুখি? কারণ কি হতে পারে?


উত্তর:


126

আপনার রিসাইক্লারভিউ.এডাপ্টারে স্থিতিশীল আইডি ব্যবহার করার চেষ্টা করুন

setHasStableIds(true)এবং ওভাররাইড getItemId(int position)

স্থিতিশীল আইডি ছাড়াই, পরে notifyDataSetChanged()ভিউহোল্ডাররা সাধারণত একই পজিশনে না বরাদ্দ থাকে। আমার ক্ষেত্রে চোখের পলকের কারণ ছিল।

আপনি এখানে একটি ভাল ব্যাখ্যা পেতে পারেন


1
আমি সেটহ্যাসস্টেবলআইডস (সত্য) যুক্ত করেছি, যা ঝাঁকুনির সমাধান করে, তবে আমার গ্রিডলাউটে আইটেমগুলি এখনও স্ক্রোলিংয়ে স্থান পরিবর্তন করে। GetItemId () এ আমার কী ওভাররাইড করা উচিত? ধন্যবাদ
বালিজ অরব্যান

3
কীভাবে আমাদের আইডি তৈরি করা উচিত?
মাউকার

তুমি দারুন! গুগল নয়। গুগল হয় হয় এ সম্পর্কে জানেন না তারা জানেন এবং আমাদের জানতে চান না! আপনাকে ধন্যবাদ
এমবিএইচ

1
আইটেমের অবস্থানগুলিতে গোলমাল করুন, আইটেমগুলি সঠিক ক্রমে ফায়ারবেস ডাটাবেস থেকে আসে।
মুহাম্মদআলিজির

1
@ মওকার যদি আপনার অবজেক্টের একটি অনন্য নম্বর থাকে তবে আপনি এটি ব্যবহার করতে পারেন বা যদি আপনার অনন্য স্ট্রিং থাকে তবে আপনি অবজেক্ট.হ্যাশকোড () ব্যবহার করতে পারেন। এটি আমার পক্ষে পুরোপুরি সূক্ষ্মভাবে কাজ করে
সাইমন শুবার্ট

106

এই ইস্যু পৃষ্ঠা অনুসারে .... এটি ডিফল্ট পুনর্ব্যবহারযোগ্য আইটেম পরিবর্তন অ্যানিমেশন ... আপনি এটিকে বন্ধ করতে পারেন .. এটি চেষ্টা করে দেখুন

recyclerView.getItemAnimator().setSupportsChangeAnimations(false);

সর্বশেষ সংস্করণে পরিবর্তন

অ্যান্ড্রয়েড বিকাশকারী ব্লগ থেকে উদ্ধৃত :

নোট করুন যে এই নতুন এপিআই পিছনে সামঞ্জস্যপূর্ণ নয়। আপনি যদি আগে কোনও আইটেমএনিমেটার প্রয়োগ করে থাকেন তবে আপনি পরিবর্তে সিম্পল আইটেমনিমেটর প্রসারিত করতে পারেন, যা নতুন এপিআই মোড়ের মাধ্যমে পুরানো এপিআই সরবরাহ করে। আপনি লক্ষ্য করবেন যে কিছু পদ্ধতি সম্পূর্ণরূপে আইটেমএনিমেটর থেকে সরানো হয়েছে। উদাহরণস্বরূপ, আপনি যদি রিসাইক্লারভিউ.জেটআইটিম অ্যানিম্যাটর () সেটসপোর্টস চেঞ্জঅ্যানিমেশনস (মিথ্যা) কল করে থাকেন তবে এই কোডটি আর সংকলন করবে না। আপনি এটি দিয়ে প্রতিস্থাপন করতে পারেন:

ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
  ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}

5
@ সাবীর এখনও একই ইস্যু। এটি সমস্যার সমাধান করছে না।
শ্রেয়াশ মহাজন

3
@ ডেলিভ আপনি যদি এর কোনও সমাধান খুঁজে পান তবে আমাকে জানতে দিন
শ্রেয়াশ মহাজন

আমি পিকাসো ব্যবহার করছি, এটি কিছু, জ্বলজ্বলে নয়।

8
Kotlin: (যেমন SimpleItemAnimator recyclerView.itemAnimator?) ?. supportsChangeAnimations = মিথ্যা
পেড্রো পাওলো মধ্যে Amorim

এটি কাজ করছে, তবে অন্যান্য ইস্যু আসছে (এনপিই) java.lang. নালপয়েন্টার এক্সসেপশন: শূন্য 'অ্যান্ড্রয়েড.সপ্পার্ট.ভি 7.উইজেট.আরেক্টারভিউ $ আইটেমঅ্যানিম্যাটর $ আইটেমহোল্ডারআইনফো.ফেল্ট' থেকে নাল অবজেক্টের রেফারেন্সে পড়ার চেষ্টা আছে এটি সমাধান করতে?
নাভাস পিকে

46

এটি কেবল কাজ করেছে:

recyclerView.getItemAnimator().setChangeDuration(0);

এটি codeআইটেমএনিমেটার অ্যানিমেটার = রিসাইক্লারভিউ.সেট আইটেমনিমেটরের () একটি ভাল বিকল্প ; যদি (সিম্পল আইটেমনিমেটর অ্যানিমেটার) {((সিম্পল আইটেমনিমেটর) অ্যানিমেটার) .setSupportsChangeAnimations (মিথ্যা); }code
জিনেস্ট্রো

1
সমস্ত অ্যানিমেশনগুলি ADD এবং সরান
এমবিএইচ

11

আমার কাছে কিছু url এবং তারপরে চিত্রভিউ ব্লিঙ্কগুলি থেকে চিত্র লোড করার একই সমস্যা রয়েছে। ব্যবহার করে সমাধান করা

notifyItemRangeInserted()    

পরিবর্তে

notifyDataSetChanged()

যা সেই অপরিবর্তিত পুরানো ডাটাগুলি পুনরায় লোড করতে এড়িয়ে যায়।


9

ডিফল্ট অ্যানিমেশন অক্ষম করার জন্য এটি চেষ্টা করুন

ItemAnimator animator = recyclerView.getItemAnimator();

if (animator instanceof SimpleItemAnimator) {
  ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}

অ্যানড্রয়েড সমর্থন 23 এর পরে এটি অ্যানিমেশনটি অক্ষম করার নতুন উপায়

এই পুরানো উপায়টি সমর্থন লাইব্রেরির পুরানো সংস্করণের জন্য কাজ করবে

recyclerView.getItemAnimator().setSupportsChangeAnimations(false)

4

ধরে mItemsনেওয়া সেই সংগ্রহ যা আপনার পিছনে রয়েছেAdapter , আপনি কেন সমস্ত কিছু সরিয়ে আবার সংযোজন করছেন? আপনি মূলত এটি বলছেন যে সমস্ত কিছু পরিবর্তিত হয়েছে, তাই রিসাইক্লারভিউ আমার মতামত তুলনা করে সমস্ত মতামত পুনঃনির্দেশিত করে যেখানে চিত্র গ্রন্থাগার এটি সঠিকভাবে পরিচালনা করে না যেখানে এটি একই চিত্রের url হওয়া সত্ত্বেও দৃশ্যটি পুনরায় সেট করে। অ্যাডাপ্টারভিউয়ের সমাধানে তাদের কিছু বেকড থাকতে পারে যাতে এটি গ্রিডভিউতে দুর্দান্ত কাজ করে।

কল করার পরিবর্তে notifyDataSetChangedযা সমস্ত দর্শনকে পুনরায় বাধ্য করে তোলে, কল করার জন্য গ্রানুলার বিজ্ঞপ্তি ইভেন্টগুলিকে কল করুন (যোগ করা / সরানো / সরানো / আপডেট করা বিজ্ঞপ্তি) যাতে রিসাইক্লারভিউ কেবলমাত্র প্রয়োজনীয় দৃষ্টিভঙ্গিগুলি পুনরায় প্রত্যাবর্তন করে এবং কিছুই ঝাঁকুনি দেয় না।


3
অথবা এটি কেবল রিসাইক্লার ভিউতে একটি "বাগ"? স্পষ্টতই যদি এটি অ্যাবস্লিস্টভিউয়ের সাথে গত 6 বছর ধরে ঠিকঠাক কাজ করে এবং এখন এটি রিসাইক্লার ভিউয়ের সাথে না হয়, তার মানে কিছু রেকসিলারভিউয়ের সাথে ঠিক আছে না, তাই না? :) এটির তাত্ক্ষণিক পর্যালোচনাটি দেখায় যে আপনি যখন তালিকাভিউ এবং গ্রিডভিউতে ডেটা রিফ্রেশ করেন তখন তারা + অবস্থানের অবস্থানের উপর নজর রাখেন, তাই আপনি যখন রিফ্রেশ করবেন তখন আপনি ঠিক একই দর্শকের অধিকারী হবেন। রিসাইক্লারভিউ দেখার ধারককে বদলে দেয়, যা ঝাঁকুনিতে বাড়ে।
ভোভকাব

তালিকাভিউতে কাজ করার অর্থ এই নয় যে এটি রিসাইক্লারভিউয়ের জন্য সঠিক। এই উপাদানগুলির বিভিন্ন আর্কিটেকচার রয়েছে।
ইয়িগিট 20'15

1
সম্মত হন, তবে কখনও কখনও কী আইটেমগুলি পরিবর্তিত হয় তা জানা সত্যিই শক্ত, উদাহরণস্বরূপ যদি আপনি কার্সার ব্যবহার করেন বা আপনি কেবল পুরো ডেটা রিফ্রেশ করেন। সুতরাং পুনর্ব্যবহারযোগ্য দৃষ্টিভঙ্গি এই ক্ষেত্রে সঠিকভাবে পরিচালনা করা উচিত।
ভোভকাব

4

রিসাইক্লারভিউ এটি ডিফল্ট অ্যানিমেটার হিসাবে ডিফল্ট আইটেমিনিমেটার ব্যবহার করে। আপনি নীচের কোড থেকে দেখতে পাচ্ছেন, তারা আইটেম পরিবর্তনের পরে ভিউ হোল্ডারের আলফা পরিবর্তন করে:

@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
    ...
    final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView);
    ...
    ViewCompat.setAlpha(oldHolder.itemView, prevAlpha);
    if (newHolder != null) {
        ....
        ViewCompat.setAlpha(newHolder.itemView, 0);
    }
    ...
    return true;
}

আমি বাকি অ্যানিমেশনগুলি ধরে রাখতে চেয়েছিলাম তবে "ঝাঁকুনি" মুছে ফেলতে পেরেছি তাই আমি ডিফল্ট আইটেম অ্যানিমেটারকে ক্লোন করেছি এবং উপরের 3 টি আলফা লাইনগুলি সরিয়েছি।

নতুন অ্যানিমেটারটি ব্যবহার করতে কেবল আপনার রিসাইক্লারভিউতে সেটআইটেমি অ্যানিমেটার () কল করুন:

mRecyclerView.setItemAnimator(new MyItemAnimator());

এটি জ্বলজ্বল অপসারণ করেছে তবে এটি কোনও কারণে ঝাঁকুনির প্রভাব তৈরি করেছে।
মোহাম্মদ মেধাত

4

কোটলিনে আপনি পুনর্ব্যবহারযোগ্য ভিউয়ের জন্য 'শ্রেণিবদ্ধকরণ' ব্যবহার করতে পারেন:

fun RecyclerView.disableItemAnimator() {
    (itemAnimator as? SimpleItemAnimator)?.supportsChangeAnimations = false
}

// sample of using in Activity:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // ...
    myRecyclerView.disableItemAnimator()
    // ...
}

1

আরে @ অলি এটা দেরী রিপ্লে হতে পারে। আমিও এই সমস্যার মুখোমুখি হয়েছি এবং নীচের সমাধানের সাথে সমাধান করেছি, এটি আপনাকে দয়া করে চেক করতে সহায়তা করতে পারে।

LruBitmapCache.java ক্লাসটি চিত্রের ক্যাশের আকার পেতে তৈরি করা হয়েছে

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruBitmapCache extends LruCache<String, Bitmap> implements
        ImageCache {
    public static int getDefaultLruCacheSize() {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;

        return cacheSize;
    }

    public LruBitmapCache() {
        this(getDefaultLruCacheSize());
    }

    public LruBitmapCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }
}

VolleyClient.java ক্লাস [প্রয়োগ প্রসারিত] কোডের নিচে যুক্ত হয়েছে

ভল্লিক্লিয়েন্ট সিঙ্গলটন ক্লাস কন্সট্রাক্টর ইমেজলোডার শুরু করার জন্য স্নিপেটের নীচে যুক্ত করুন

private VolleyClient(Context context)
    {
     mCtx = context;
     mRequestQueue = getRequestQueue();
     mImageLoader = new ImageLoader(mRequestQueue,getLruBitmapCache());
}

আমি LruBitmapCache ফিরে আসার জন্য getLruBitmapCache () পদ্ধতি তৈরি করেছি

public LruBitmapCache getLruBitmapCache() {
        if (mLruBitmapCache == null)
            mLruBitmapCache = new LruBitmapCache();
        return this.mLruBitmapCache;
}

আশা করি এটি আপনাকে সাহায্য করবে।


আপনার উত্তরের জন্য ধন্যবাদ. আমার ভলিক্লায়েন্ট.জভাতে আমি ঠিক এটি করেছি। একবার দেখুন: ভল্লিক্লিয়েন্ট.জভা
আলী

LruCache <স্ট্রিং, বিটম্যাপ> ক্লাস ব্যবহার করে একবার পরীক্ষা করে দেখুন, আমি মনে করি এটি আপনার সমস্যার সমাধান করবে to LruCache
অ্যান্ড্রয়েড শিক্ষার্থী

আমি মন্তব্যে আপনার সাথে ভাগ করে নেওয়ার কোডটি একবার পরীক্ষা করে দেখেছি? তোমার ক্লাসে এমন কী আছে যা আমি সেখানে মিস করেছি?
আলী

আমি কীভাবে করেছি এর মতো লরুচা <স্ট্রিং, বিটম্যাপ> শ্রেণি এবং ওভাররাইডিং আকার () পদ্ধতিটি মিস করছি। বাকিগুলি আমার কাছে ঠিক আছে বলে মনে হচ্ছে।
অ্যান্ড্রয়েড লার্নার

ঠিক আছে, আমি খুব তাড়াতাড়িই চেষ্টা করে দেখি, তবে আপনি কি আমাকে এখানে ব্যাখ্যা করতে পারেন যা আপনার জন্য যাদু করেছে এবং সমস্যার সমাধান করেছে? সোর্সকোড আমার কাছে মনে হচ্ছে আপনার ওভারডেন আকারের পদ্ধতিটি যদি উত্স কোডে থাকা উচিত।
আলী

1

আমার জন্য recyclerView.setHasFixedSize(true);কাজ


আমি মনে করি না যে
ওপির

এটি আমার ক্ষেত্রে আমাকে সহায়তা করেছে
bst91

1

আমার ক্ষেত্রে, উপরের কোনওটিই নয় বা একই সমস্যাযুক্ত অন্যান্য স্ট্যাকওভারফ্লো প্রশ্নগুলির উত্তরগুলির কাজ হয়নি।

ঠিক আছে, আমি প্রতিবার আইটেমটি ক্লিক করার সাথে সাথে কাস্টম অ্যানিমেশনটি ব্যবহার করছিলাম, যার জন্য আমি আমার কাস্টমঅ্যানিম্যাটর ক্লাসে পেডলোড পাস করার জন্য নোটিফাইম আইটেম চেঞ্জড (ইনট পজিশন, অবজেক্ট পেইলোড) কল করছিলাম।

লক্ষ্য করুন, রিসাইক্লারভিউ অ্যাডাপ্টারে 2 টি অনবিন্দ ভিহোল্ডার (...) পদ্ধতি উপলব্ধ। 3 পরামিতিযুক্ত অনবিন্দভিউহোল্ডার (...) পদ্ধতিটি সর্বদা 2 পরামিতিযুক্ত অনব্যান্ডভিউহোল্ডার (...) পদ্ধতির আগে কল করা হবে।

সাধারণত, আমরা সর্বদা 2B পরামিতিযুক্ত onBindVHHolder (...) পদ্ধতিটি ওভাররাইড করি এবং সমস্যার মূল মূল কারণ হ'ল আমি একই কাজ করছিলাম, প্রতিবার বিজ্ঞপ্তি আইটেম চেঞ্জ করা (...) নামক সাথে সাথে, আমাদের অনবিন্দভিউহোল্ডার (...) পদ্ধতিটি হবে ডাকা হবে, যার মধ্যে আমি পিকাসো ব্যবহার করে ইমেজভিউতে আমার চিত্রটি লোড করছিলাম এবং এ কারণেই এটি স্মৃতি থেকে বা ইন্টারনেট থেকে নির্বিশেষে আবার লোড হচ্ছে। লোড হওয়া অবধি, এটি আমাকে স্থানধারক চিত্রটি দেখিয়েছিল যা আমি যখনই আইটেমভিউটিতে ক্লিক করি তখন 1 সেকেন্ডের জন্য ঝলকানোর কারণ ছিল।

পরবর্তীতে, আমি 3 টি পরামিতি বিশিষ্ট অন্য অনবিন্দউহোল্ডার (...) পদ্ধতিকেও ওভাররাইড করি। এখানে আমি যাচাইয়ের তালিকাটি খালি কিনা তা যাচাই করে নিই, তবে আমি এই পদ্ধতির সুপার বর্গ বাস্তবায়ন ফিরিয়ে দেব, অন্যথায় যদি পে-লোড হয়, আমি কেবল ধারকটির আইটেম ভিউয়ের আলফা মান সেট করছি।

এবং হ্যাঁ, দুঃখের সাথে আমার পুরো দিনটি নষ্ট করার পরে আমি আমার সমস্যার সমাধান পেয়েছি!

অনবিন্দ ভিহোল্ডার (...) পদ্ধতিগুলির জন্য আমার কোডটি এখানে রয়েছে:

2 প্যারাম সহ অনবিন্দভিউহোল্ডার (...):

@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder viewHolder, int position) {
            Movie movie = movies.get(position);

            Picasso.with(context)
                    .load(movie.getImageLink())
                    .into(viewHolder.itemView.posterImageView);
    }

3 প্যারাম সহ অনবিন্দভিউহোল্ডার (...):

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
        if (payloads.isEmpty()) {
            super.onBindViewHolder(holder, position, payloads);
        } else {
            holder.itemView.setAlpha(1);
        }
    }

অনক্রিট ভিউহোল্ডার (...) এ আমি যে পদ্ধতির কোডটি ভিউহোল্ডারের আইটেম ভিউতে ক্লিক করলাম তাতে ক্লিক করছিলাম:

private void onMovieClick(int position, Movie movie) {
        Bundle data = new Bundle();
        data.putParcelable("movie", movie);

        // This data(bundle) will be passed as payload for ItemHolderInfo in our animator class
        notifyItemChanged(position, data);
    }

দ্রষ্টব্য: আপনি অনক্রিটভিউহোল্ডার (...) থেকে আপনার ভিউহোল্ডারের getAdapterPosition () পদ্ধতিতে কল করে এই অবস্থানটি পেতে পারেন।

আমি নীচে getItemId (int অবস্থান) পদ্ধতিটি ওভাররাইড করেছি:

@Override
public long getItemId(int position) {
    Movie movie = movies.get(position);
    return movie.getId();
}

এবং ডাকা setHasStableIds(true); ক্রিয়াকলাপে আমার অ্যাডাপ্টার অবজেক্টটিকে আনে।

আশা করি উপরোক্ত উত্তরগুলির মধ্যে কোনওটি যদি কাজ না করে তবে এটি সহায়তা করবে!


1

আমার ক্ষেত্রে অনেক সহজ সমস্যা ছিল তবে এটি উপরের সমস্যার মতো দেখতে / অনুভব করতে পারে। আমি একটি এক্সপেনডেবললিস্টভিউকে গ্রুপের সাথে একটি রিসেলারভিউতে রূপান্তরিত করেছিলাম (গ্রুপের সম্প্রসারণযোগ্য গ্রুপ বৈশিষ্ট্যটি ব্যবহার করে)। আমার প্রাথমিক বিন্যাসে এর একটি বিভাগ ছিল:

<androidx.recyclerview.widget.RecyclerView
  android:id="@+id/hint_list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@android:color/white" />

লেআউট_উইটটি "মোড়ানো_কন্টেন্ট" এ সেট করে প্রসারিত গোষ্ঠী থেকে ধসে পড়া গোষ্ঠীতে অ্যানিমেশনটি মনে হয়েছিল যেন এটি ফ্ল্যাশ হয়ে যাবে তবে এটি "ভুল" অবস্থান থেকে সত্যই অ্যানিমেশন ছিল (এমনকি এই থ্রেডের বেশিরভাগ সুপারিশ চেষ্টা করার পরেও)।

যাইহোক, কেবলমাত্র লেআউট_ উচ্চতাটি ম্যাচের_পরিবারের মতো পরিবর্তন করা সমস্যার সমাধান করে।

<androidx.recyclerview.widget.RecyclerView
  android:id="@+id/hint_list"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/white" />

0

আমার অনুরূপ সমস্যা ছিল এবং এটি আমার জন্য কাজ করেছে আপনি চিত্রের ক্যাশের জন্য আকার নির্ধারণ করতে এই পদ্ধতিটি কল করতে পারেন

private int getCacheSize(Context context) {

    final DisplayMetrics displayMetrics = context.getResources().
            getDisplayMetrics();
    final int screenWidth = displayMetrics.widthPixels;
    final int screenHeight = displayMetrics.heightPixels;
    // 4 bytes per pixel
    final int screenBytes = screenWidth * screenHeight * 4;

    return screenBytes * 3;
}

0

আমার অ্যাপ্লিকেশনটির জন্য, আমার কিছু ডেটা পরিবর্তন হয়েছিল তবে আমি পুরো ভিউটি পলক করতে চাইনি।

আমি এটি কেবলমাত্র পুরানো দর্শনটি 0.5 টি আলফা দ্বারা বিবর্ণ এবং নতুন ভিউ আলফাটি 0.5 তে শুরু করে সমাধান করেছি। এটি দর্শনটি সম্পূর্ণ অদৃশ্য না করে একটি নরম বিবর্ণ ট্রানজিশন তৈরি করেছে।

দুর্ভাগ্যক্রমে বেসরকারী বাস্তবায়নের কারণে, আমি এই পরিবর্তনটি করার জন্য ডিফল্ট আইটেম অ্যানিমেটারকে সাবক্লাস করতে পারি না তাই আমাকে কোডটি ক্লোন করতে হয়েছিল এবং নিম্নলিখিত পরিবর্তনগুলি করতে হয়েছিল

অ্যানিমেট চেঞ্জে:

ViewCompat.setAlpha(newHolder.itemView, 0);  //change 0 to 0.5f

ইনমেট চেঞ্জআইপল ইন:

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { //change 0 to 0.5f

0

মতামত আপডেট করার জন্য উপযুক্ত পুনর্ব্যবহারযোগ্য পদ্ধতিগুলি ব্যবহার করা এই সমস্যার সমাধান করবে

প্রথমে তালিকায় পরিবর্তন আনুন

mList.add(item);
or mList.addAll(itemList);
or mList.remove(index);

তারপরে ব্যবহার করে অবহিত করুন

notifyItemInserted(addedItemIndex);
or
notifyItemRemoved(removedItemIndex);
or
notifyItemRangeChanged(fromIndex, newUpdatedItemCount);

আশা করি এটি সাহায্য করবে !!


একেবারে না. আপনি যদি সেকেন্ডে বেশ কয়েকটি আপডেট করে থাকেন (আমার ক্ষেত্রে বিএলই স্ক্যানিং) এটি মোটেও কার্যকর হয় না। আমি এই ছিটে রিক্সিলার অ্যাডাপ্টার আপডেট করার জন্য একদিন কাটিয়েছি ... অ্যারেএডাপ্টার রাখাই ভাল। এটি লজ্জার বিষয় যা এমভিসি প্যাটার্নটি ব্যবহার করে না, তবে কমপক্ষে এটি প্রায় ব্যবহারযোগ্য।
Gojir4


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.