রিসাইক্লারভিউতে লিস্টভিউ.সেটম্পিভিউয়ের সমতুল্য


89

ইন RecyclerView, আমি অ্যাডাপ্টার খালি থাকার সময় দেখানোর জন্য একটি খালি ভিউ সেট করতে চাই। এর সমতুল্য কি আছে ListView.setEmptyView()?


4
দেখতে RecyclerView setEmptyView সম্ভবত সাহায্যের একই অর্জনে
ρяσѕρєя কে

উত্তর:


69

নতুন ডেটা বাঁধাই বৈশিষ্ট্যটির সাহায্যে আপনি সরাসরি আপনার বিন্যাসে এটি অর্জন করতে পারেন:

<TextView
   android:text="No data to display."
   android:visibility="@{dataset.size() > 0 ? View.GONE : View.VISIBLE}" />

সেক্ষেত্রে আপনার এক্সএমএল এর ডেটা বিভাগে আপনাকে কেবল একটি পরিবর্তনশীল এবং একটি আমদানি যুক্ত করতে হবে:

<data>
<import type="android.view.View"/>
<variable
    name="dataset"
    type="java.util.List&lt;java.lang.String&gt;"
    />
</data>

6
উপাত্তের উদাহরণটি বন্ডিং পদ্ধতির উপর জোর দেওয়ার জন্য সরল করা হয়েছে। ডেটা বাঁধাই খুব নমনীয়। আপনি অবশ্যই Adapterডেটাসেটের পরিবর্তে আমদানি করতে পারেন এবং এটি ব্যবহার করতে পারেন getItemCount()বা সমস্ত কিছু একটি এর মধ্যে মোড়ানো ViewModelএবং সেট android:visibilityকরতে পারেন viewModel.getEmptyViewVisibility()
আন্দ্রে ডেরাম্যান

4
এটিকে আরও বেশি ভোট দেওয়া উচিত, এটি ডেটা বাঁধাইয়ের ক্ষমতার একটি দুর্দান্ত উদাহরণ
এড জর্জ

4
@ জাভমারিনা না, আমার জন্য লেআউটটি আপডেট করা অবিরত হয়নি। যদি আমার অ্যাডাপ্টারটি 0 আকারের সাথে শুরু হয় এবং পরে ডেটাসেট বৃদ্ধি পায়, লেআউটটি পছন্দ অনুযায়ী আপডেট হবে না। এটি উপস্থিত হয় ডেটা বাইন্ডিং আমার পক্ষে কাজ করবে না। :-(
meisteg

4
অ্যাডাপ্টারটি গতিশীলভাবে বাড়ছে বা শূন্যে সঙ্কুচিত হয়েও কি এটি আপডেট হতে চলেছে? আমি ওটা সন্দেহ করেছি.
ডেভিড

4
@ a11n তালিকাটি 0 এ সঙ্কুচিত হয় বা ডেটা আসে যখন এটি বিন্যাসটি আপডেট করে না, প্রতিবার তালিকায় কোনও পরিবর্তন আনতে আমাদের ক্লাস থেকে বাইন্ডিংয়ের মান নির্ধারণ করতে হবে, নিজেই বিন্যাস আপডেট করার কোনও উপায় আছে কি?
ওম ইনফোয়াভেভ বিকাশকারীগণ

116

এখানে @ ড্রাগন জন্মানোর মতো একটি শ্রেণি রয়েছে, তবে আরও সম্পূর্ণ। উপর ভিত্তি করে এই সারকথা

public class EmptyRecyclerView extends RecyclerView {
    private View emptyView;
    final private AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            checkIfEmpty();
        }
    };

    public EmptyRecyclerView(Context context) {
        super(context);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    void checkIfEmpty() {
        if (emptyView != null && getAdapter() != null) {
            final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
            emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
            setVisibility(emptyViewVisible ? GONE : VISIBLE);
        }
    }

    @Override
    public void setAdapter(Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }

        checkIfEmpty();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
        checkIfEmpty();
    }
}

আমি কীভাবে এই ক্লাসটি ব্যবহার করতে পারি তা দয়া করে ব্যাখ্যা করতে পারেন?
ওলোলোকিং

ঠিক যেমন আপনি একটি পুনর্ব্যবহারযোগ্য ভিউয়ের সাথে করতেন ঠিক তেমন setEmptyViewপদ্ধতিটি যুক্ত করে , আপনি যখনই খালি দৃশ্যটি সংজ্ঞায়িত করতে চান কল করতে পারবেন। ListView.setEmptyViewডকুমেন্টেশনটি যদি এটি অস্পষ্ট থাকে তবে দেখুন এটি একই ধারণা।
মার্ক প্লানো-লেসেই

4
গুগল নমুনা থেকে অনুরূপ বাস্তবায়ন: github.com/googlesferences/android-XYZTouristAttferences/blob/…
জেস

4
দুর্দান্ত সমাধান তবে একটি শ্রেণীর নামটি অদ্ভুত =)
Шах

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

26

এই লিঙ্কে প্রদত্ত সমাধানটি নিখুঁত বলে মনে হচ্ছে। খালি ভিউ কখন প্রদর্শিত হবে তা সনাক্ত করতে এটি ভিউটাইপ ব্যবহার করে। কাস্টম রিসাইকেলারভিউ তৈরি করার দরকার নেই

উপরের লিঙ্ক থেকে কোড যুক্ত করা হচ্ছে:

package com.example.androidsampleproject;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class RecyclerViewActivity extends Activity {

RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recycler_view);
    recyclerView = (RecyclerView) findViewById(R.id.myList);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(new MyAdapter());
}


private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<String> dataList = new ArrayList<String>();

    public class EmptyViewHolder extends RecyclerView.ViewHolder {
        public EmptyViewHolder(View itemView) {
            super(itemView);
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView data;

        public ViewHolder(View v) {
            super(v);
            data = (TextView) v.findViewById(R.id.data_view);
        }
    }

    @Override
    public int getItemCount() {
        return dataList.size() > 0 ? dataList.size() : 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (dataList.size() == 0) {
            return EMPTY_VIEW;
        }
        return super.getItemViewType(position);
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder vho, final int pos) {
        if (vho instanceof ViewHolder) {
            ViewHolder vh = (ViewHolder) vho;
            String pi = dataList.get(pos);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;

        if (viewType == EMPTY_VIEW) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_view, parent, false);
            EmptyViewHolder evh = new EmptyViewHolder(v);
            return evh;
        }

        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.data_row, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    private static final int EMPTY_VIEW = 10;
}

}

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

অনেক রিসাইক্লার অ্যাডাপ্টার ব্যবহার করার সময় এটি @ গুণহানকে বোঝায়। আপনি সকলের সাধারণ জিনিসগুলির জন্য কাস্টমাইজড একক বেসএডাপ্টার প্রসারিত করার চেষ্টা করতে পারেন
সুধাশ্রী

4
এমনকি যদি আপনার কেবল একটি অ্যাডাপ্টার এবং একটি পুনর্ব্যবহারযোগ্য ভিউ থাকে তবে এটি অ্যাডাপ্টারের দায়বদ্ধতা নয়। অ্যাডাপ্টার এখানে আইটেম উপস্থাপন, আইটেম অনুপস্থিত।
মার্ক প্লানো-লেসেই

@ কর্নাল্ড আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। ব্যক্তিগতভাবে আমি মনে করি সুধাশ্রী যেভাবে করেছিলেন সেটি এটি অনেক বেশি পরিচ্ছন্ন। বিশেষত যদি কোনও আইটেম উপহার না দেওয়ার ক্ষেত্রে আপনি ভিন্ন দৃষ্টিভঙ্গি প্রদর্শন করতে চান যেমন: "এখানে আইটেম নেই, কেনাকাটা করতে যান!" বা এর মতো স্টাফ
এজেন্টকনপফ

@ জয়নোডিস যেমনটি আপনি বলেছেন, এটি ভিন্ন মত। এটা না অ্যাডাপ্টারের এর responsability, recyclerview আইটেম প্রদর্শন করে যা, অন্য কিছুই। আমি সম্মত হই যে প্রযুক্তিগতভাবে কথা বলা, উভয় সমাধানই কাজ করে এবং বেশ সমান। তবে অ্যাডাপ্টারের আইটেমগুলি এর মতো দেখানোর জন্য তৈরি করা হয় না
মার্ক প্লানো-লেসেই

10

আমি কেবল একটি সহজ সমাধান পছন্দ করি যেমন,

আপনার রিসাইক্লার ভিউ ফ্রেমলাউট বা রিলেটিভলআউটের সাথে একটি টেক্সটভিউ বা অন্যান্য দৃশ্যের সাথে দৃশ্যমানতার সাথে খালি ডেটা বার্তা প্রদর্শন করে ডিফল্টরূপে যান এবং তারপরে অ্যাডাপ্টারের শ্রেণিতে যুক্তি প্রয়োগ করুন

এখানে, আমার কাছে একটি টেক্সটভিউ রয়েছে যাতে কোনও বার্তা নেই message

@Override
public int getItemCount() {
    textViewNoData.setVisibility(data.size() > 0 ? View.GONE : View.VISIBLE);
    return data.size();
}

3

চেষ্টা করুন RVEmptyObserver:

এটি এর একটি বাস্তবায়ন AdapterDataObserverযা আপনাকে কেবল Viewআপনার জন্য ডিফল্ট খালি বিন্যাস হিসাবে সেট করতে দেয় RecylerView। এইভাবে, একটি কাস্টম ব্যবহার RecyclerViewএবং আপনার জীবনকে আরও শক্ত করার পরিবর্তে আপনি সহজেই এটি আপনার বিদ্যমান কোড দিয়ে ব্যবহার করতে পারেন:


ব্যবহারের উদাহরণ:

RVEmptyObserver observer = new RVEmptyObserver(recyclerView, emptyView)
rvAdapter.registerAdapterDataObserver(observer);

আপনি এখানে একটি বাস্তব অ্যাপ্লিকেশনটিতে কোড এবং উদাহরণ ব্যবহার দেখতে পারেন ।


শ্রেণি:

public class RVEmptyObserver extends RecyclerView.AdapterDataObserver {
    private View emptyView;
    private RecyclerView recyclerView;

    public RVEmptyObserver(RecyclerView rv, View ev) {
        this.recyclerView = rv;
        this.emptyView    = ev;
        checkIfEmpty();
    }

    private void checkIfEmpty() {
        if (emptyView != null && recyclerView.getAdapter() != null) {
            boolean emptyViewVisible = recyclerView.getAdapter().getItemCount() == 0;
            emptyView.setVisibility(emptyViewVisible ? View.VISIBLE : View.GONE);
            recyclerView.setVisibility(emptyViewVisible ? View.GONE : View.VISIBLE);
        }
    }

    public void onChanged() { checkIfEmpty(); }
    public void onItemRangeInserted(int positionStart, int itemCount) { checkIfEmpty(); }
    public void onItemRangeRemoved(int positionStart, int itemCount) { checkIfEmpty(); }
}

2

আমার সংস্করণ, https://gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c এর উপর ভিত্তি করে

public class EmptyRecyclerView extends RecyclerView {
    @Nullable
    private View emptyView;

    public EmptyRecyclerView(Context context) { super(context); }

    public EmptyRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private void checkIfEmpty() {
        if (emptyView != null && getAdapter() != null) {
            emptyView.setVisibility(getAdapter().getItemCount() > 0 ? GONE : VISIBLE);
        }
    }

    private final AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            checkIfEmpty();
        }
    };

    @Override
    public void setAdapter(@Nullable Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }
        checkIfEmpty();
    }

    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(visibility);
        if (null != emptyView && (visibility == GONE || visibility == INVISIBLE)) {
            emptyView.setVisibility(GONE);
        } else {
            checkIfEmpty();
        }
    }

    public void setEmptyView(@Nullable View emptyView) {
        this.emptyView = emptyView;
        checkIfEmpty();
    }
}

4
রিম্পিমেন্ট করার setVisibilityজন্যও ভাল ধারণা ।
মার্ক প্লানো-লেসেই

2

আমি এই কার্যকারিতাটি রিসাইকেল.আডাপ্টারে প্রয়োগ করতে পছন্দ করব

আপনার ওভাররাইড হওয়া আইটেমকাউন্ট পদ্ধতিতে, সেখানে খালি চেক কোডগুলি ইনজেক্ট করুন:

@Override
public int getItemCount() {
    if(data.size() == 0) listIsEmtpy();
    return data.size();
}

4
এটি অ্যাডাপ্টারের দায়বদ্ধতা নয়। অ্যাডাপ্টার এখানে আইটেম উপস্থাপন, আইটেম অনুপস্থিত।
মার্ক প্লানো-লেসে

@ কর্নাল্ড এটি আমাদের কোড এবং এটি নিজস্ব পদ্ধতি, আমরা কীভাবে এটি কাস্টমাইজ করি এবং এটি ব্যবহার করি।
ললিত পপতানি

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

@ কর্নাল্ড ভালভাবে আমি মনে করি এই সমাধানটি সবার মধ্যে সহজতম এবং এটির একটি ভাল সমাধানও, কারণ প্রতিবার অ্যাডাপ্টারের সাথে বিজ্ঞপ্তি দেওয়া হলে এটি ডাকা হবে এবং তথ্যের আকার যাচাই করতে ব্যবহার করা যেতে পারে!
ললিত পপতানি

4
@ মারকপ্লাণো-লেসে সঠিক is এই উত্তরটি অসম্পূর্ণ কারণ আইটেমগুলি পূরণ হয়ে গেলে খালি দৃশ্যটি অদৃশ্য হওয়ার দরকার হলে এটি কেসটি পরিচালনা করে না। এই অংশটি প্রয়োগ করার পরে এই সমাধানটি অকার্যকর হয়ে যায় কারণ প্রতিবার অ্যাডাপ্টার আইটেমের গণনা অনুসন্ধান করে setVisibility(), ডেকে আনে। অবশ্যই আপনি ক্ষতিপূরণ করতে কিছু পতাকা যুক্ত করতে পারেন তবে এটি যখন আরও জটিল হয়।
razzledazzle

2

আপনি যদি লোডিং রাষ্ট্র, ত্রুটি রাষ্ট্রের মতো আরও রাজ্যগুলিকে সমর্থন করতে চান তবে আপনি https://github.com/rockerhieu/rv-adapter-states চেকআউট করতে পারেন । অন্যথায় খালি দৃষ্টিকে সমর্থন RecyclerViewAdapterWrapperকরা ( https://github.com/rockerhieu/rv-adapter ) থেকে সহজেই প্রয়োগ করা যেতে পারে । এই পদ্ধতির প্রধান সুবিধা হ'ল বিদ্যমান অ্যাডাপ্টারের যুক্তি পরিবর্তন না করে আপনি খালি ভিউ সহজেই সমর্থন করতে পারেন:

public class StatesRecyclerViewAdapter extends RecyclerViewAdapterWrapper {
    private final View vEmptyView;

    @IntDef({STATE_NORMAL, STATE_EMPTY})
    @Retention(RetentionPolicy.SOURCE)
    public @interface State {
    }

    public static final int STATE_NORMAL = 0;
    public static final int STATE_EMPTY = 2;

    public static final int TYPE_EMPTY = 1001;

    @State
    private int state = STATE_NORMAL;

    public StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View emptyView) {
        super(wrapped);
        this.vEmptyView = emptyView;
    }

    @State
    public int getState() {
        return state;
    }

    public void setState(@State int state) {
        this.state = state;
        getWrappedAdapter().notifyDataSetChanged();
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        switch (state) {
            case STATE_EMPTY:
                return 1;
        }
        return super.getItemCount();
    }

    @Override
    public int getItemViewType(int position) {
        switch (state) {
            case STATE_EMPTY:
                return TYPE_EMPTY;
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case TYPE_EMPTY:
                return new SimpleViewHolder(vEmptyView);
        }
        return super.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (state) {
            case STATE_EMPTY:
                onBindEmptyViewHolder(holder, position);
                break;
            default:
                super.onBindViewHolder(holder, position);
                break;
        }
    }

    public void onBindEmptyViewHolder(RecyclerView.ViewHolder holder, int position) {
    }

    public static class SimpleViewHolder extends RecyclerView.ViewHolder {
        public SimpleViewHolder(View itemView) {
            super(itemView);
        }
    }
}

ব্যবহার:

Adapter adapter = originalAdapter();
StatesRecyclerViewAdapter statesRecyclerViewAdapter = new StatesRecyclerViewAdapter(adapter, emptyView);
rv.setAdapter(endlessRecyclerViewAdapter);

// Change the states of the adapter
statesRecyclerViewAdapter.setState(StatesRecyclerViewAdapter.STATE_EMPTY);
statesRecyclerViewAdapter.setState(StatesRecyclerViewAdapter.STATE_NORMAL);

আমি আপনার কোডটিকে অনুরূপ সমাধানের ভিত্তি হিসাবে ব্যবহার করেছি। ধন্যবাদ!
অ্যালবার্ট ভিলা ক্যালভো

2

আমি এটি স্থির করে
রেখেছি : তৈরি করা লেআউট বিন্যাস_সাম্যগ্রাহকদর্শন_বিহীন_েম্পটিটেক্সট.এক্সএমএল ফাইল।
খালি ভিউরিসাইকেলারভিউ.জভা তৈরি করা হয়েছে
---------

EmptyViewRecyclerView খালিRecyclerView = (EmptyViewRecyclerView) FindViewById (R.id.emptyRecyclerViewLayout);
খালিআরসাইক্লারভিউ.এডিএডাপ্টার (এমপ্রায়ারকলিকেশনসাইক্লারভিউ অ্যাডাপ্টার, "নির্বাচিত বিভাগের জন্য প্রার্থনা নেই।");

লেআউট_সাইক্লারভিউ_ও_ইম্পটিটেক্সট.এক্সএমএল ফাইল

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/switcher"
>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

<com.ninestars.views.CustomFontTextView android:id="@+id/recyclerViewEmptyTextView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Empty Text"
    android:layout_gravity="center"
    android:gravity="center"
    android:textStyle="bold"
    />

    </merge>


EmptyViewRecyclerView.java

public class EmptyViewRecyclerView extends ViewSwitcher {
private RecyclerView mRecyclerView;
private CustomFontTextView mRecyclerViewExptyTextView;

public EmptyViewRecyclerView(Context context) {
    super(context);
    initView(context);
}

public EmptyViewRecyclerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
}


private void initView(Context context) {
    LayoutInflater.from(context).inflate(R.layout.layout_recyclerview_with_emptytext, this, true);
    mRecyclerViewExptyTextView = (CustomFontTextView) findViewById(R.id.recyclerViewEmptyTextView);
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
}

public void addAdapter(final RecyclerView.Adapter<?> adapter) {
    mRecyclerView.setAdapter(adapter);
    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            if(adapter.getItemCount() > 0) {
                if (R.id.recyclerView == getNextView().getId()) {
                    showNext();
                }
            } else {
                if (R.id.recyclerViewEmptyTextView == getNextView().getId()) {
                    showNext();
                }
            }
        }
    });
}

public void addAdapter(final RecyclerView.Adapter<?> adapter, String emptyTextMsg) {
    addAdapter(adapter);
    setEmptyText(emptyTextMsg);
}

public RecyclerView getRecyclerView() {
    return mRecyclerView;
}

public void setEmptyText(String emptyTextMsg) {
    mRecyclerViewExptyTextView.setText(emptyTextMsg);
}

}

1
public class EmptyRecyclerView extends RecyclerView {
  @Nullable View emptyView;

  public EmptyRecyclerView(Context context) { super(context); }

  public EmptyRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); }

  public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  void checkIfEmpty() {
    if (emptyView != null) {
      emptyView.setVisibility(getAdapter().getItemCount() > 0 ? GONE : VISIBLE);
    }
  }

  final @NotNull AdapterDataObserver observer = new AdapterDataObserver() {
    @Override public void onChanged() {
      super.onChanged();
      checkIfEmpty();
    }
  };

  @Override public void setAdapter(@Nullable Adapter adapter) {
    final Adapter oldAdapter = getAdapter();
    if (oldAdapter != null) {
      oldAdapter.unregisterAdapterDataObserver(observer);
    }
    super.setAdapter(adapter);
    if (adapter != null) {
      adapter.registerAdapterDataObserver(observer);
    }
  }

  public void setEmptyView(@Nullable View emptyView) {
    this.emptyView = emptyView;
    checkIfEmpty();
  }
}

এর মতো কিছু সাহায্য করতে পারে


4
এটি অসম্পূর্ণ। আপনি সম্ভবত আড়াল করার প্রয়োজন হবে RecyclerViewযখন emptyViewদৃশ্যমান (এবং বিপরীত)। আপনাকেও কল করতে checkIfEmpty()হবে onItemRangeInserted()এবং onItemRangeRemoved()। ওহ, এবং আপনি আপনার উত্সটি উদ্ধৃত করতে পারতেন: gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c
মার্ক প্লানো-লেসে


1

আপনি RecyclerViewযখন খালি খালি এটি পাঠ্য করতে পারেন । নিম্নলিখিত কাস্টম উপশ্রেণী সমর্থন empty, failed, loading, এবং offlineমোড। সফল সংকলনের recyclerView_stateTextজন্য আপনার সংস্থানগুলিতে রঙ যুক্ত করুন ।

/**
 * {@code RecyclerView} that supports loading and empty states.
 */
public final class SupportRecyclerView extends RecyclerView
{
    public enum State
    {
        NORMAL,
        LOADING,
        EMPTY,
        FAILED,
        OFFLINE
    }

    public SupportRecyclerView(@NonNull Context context)
    {
        super(context);

        setUp(context);
    }

    public SupportRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs)
    {
        super(context, attrs);

        setUp(context);
    }

    public SupportRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);

        setUp(context);
    }

    private Paint textPaint;
    private Rect textBounds;
    private PointF textOrigin;

    private void setUp(Context c)
    {
        textPaint = new Paint();
        textPaint.setAntiAlias(true);
        textPaint.setColor(ContextCompat.getColor(c, R.color.recyclerView_stateText));

        textBounds = new Rect();
        textOrigin = new PointF();
    }

    private State state;

    public State state()
    {
        return state;
    }

    public void setState(State newState)
    {
        state = newState;
        calculateLayout(getWidth(), getHeight());
        invalidate();
    }

    private String loadingText = "Loading...";

    public void setLoadingText(@StringRes int resId)
    {
        loadingText = getResources().getString(resId);
    }

    private String emptyText = "Empty";

    public void setEmptyText(@StringRes int resId)
    {
        emptyText = getResources().getString(resId);
    }

    private String failedText = "Failed";

    public void setFailedText(@StringRes int resId)
    {
        failedText = getResources().getString(resId);
    }

    private String offlineText = "Offline";

    public void setOfflineText(@StringRes int resId)
    {
        offlineText = getResources().getString(resId);
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        String s = stringForCurrentState();
        if (s == null)
            return;

        canvas.drawText(s, textOrigin.x, textOrigin.y, textPaint);
    }

    private void calculateLayout(int w, int h)
    {
        String s = stringForCurrentState();
        if (s == null)
            return;

        textPaint.setTextSize(.1f * w);
        textPaint.getTextBounds(s, 0, s.length(), textBounds);

        textOrigin.set(
         w / 2f - textBounds.width() / 2f - textBounds.left,
         h / 2f - textBounds.height() / 2f - textBounds.top);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);

        calculateLayout(w, h);
    }

    private String stringForCurrentState()
    {
        if (state == State.EMPTY)
            return emptyText;
        else if (state == State.LOADING)
            return loadingText;
        else if (state == State.FAILED)
            return failedText;
        else if (state == State.OFFLINE)
            return offlineText;
        else
            return null;
    }
}

1

আমার দৃষ্টিকোণ থেকে খালি ভিউ কীভাবে করা যায় তার সহজ উপায় হ'ল আপনি একটি ব্যাকগ্রাউন্ড হিসাবে স্ফীত করতে চান এমন বিন্যাস সহ নতুন খালি রিসাইক্লারভিউ তৈরি করা। এবং এই খালি অ্যাডাপ্টারটি সেট করা হয় যখন আপনি নিজের ডেটাসেটের আকারটি পরীক্ষা করেন।

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