রিসাইক্লার ভিউয়ের সাথে বিস্তৃত তালিকা?


95

নতুন রিসাইক্লারউউয়ের সাথে বিস্তৃত তালিকা আইটেমগুলি ব্যবহার করা সম্ভব? এক্সপেন্ডেবললিস্টভিউয়ের মতো?


4
আপনি অ্যান্ড্রয়েড 6.0
zys

@zys আমি এই অ্যান্ড্রয়েড ঘড়ির উদাহরণ উত্স কোডটি কোথায় খুঁজে পাব?
অ্যাপিদেভো

4
আপনি বিভিন্ন বিন্যাস লোড করতে, যখন আপনি button.This সমাধান প্রসারিত ক্লিক অ্যান্ড্রয়েড ক্লক দ্বারা ব্যবহৃত হয় বিভিন্ন viewType ব্যবহার করতে পারেন: android.googlesource.com/platform/packages/apps/DeskClock
zys

আমার সহজ উত্তর দেখুন stackoverflow.com/a/48092441/5962715
কিরণ বেনি জোসেফ

উত্তর:


121

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

আপনি যখন কোনও বিভাগ প্রসারিত করতে চান যখন আপনি শিরোনামের পরে আপনার অ্যাডাপ্টারে নতুন আইটেম যুক্ত করুন। আপনি যখন এটি করবেন তখন notifyItemRangeInmitted কল করতে ভুলবেন না। কোনও বিভাগটি ভেঙে ফেলার জন্য আপনি কেবল প্রাসঙ্গিক আইটেমগুলি সরিয়ে ফেলুন এবং notifyItemRangeRemoved () এ কল করুন। যথাযথভাবে অবহিত যে কোনও ডেটা পরিবর্তনের জন্য, পুনর্ব্যবহারযোগ্য ভিউ দর্শনগুলিকে অ্যানিমেটেড করবে। আইটেমগুলি যুক্ত করার সময়, নতুন আইটেমগুলি ভরাট করার জন্য একটি অঞ্চল তৈরি করা হয়, নতুন আইটেমগুলি ম্লান হয়ে যায় Rem অপসারণ বিপরীত। অ্যাডাপ্টারের স্টাফের পাশাপাশি আপনাকে যা করতে হবে তা হ'ল ব্যবহারকারীকে যৌক্তিক কাঠামো জানানোর জন্য আপনার মতামতকে স্টাইল করা।

আপডেট: রায়ান ব্রুকস এখন এটি কীভাবে করবেন সে সম্পর্কে একটি নিবন্ধ লিখেছেন ।


দুর্দান্ত পরামর্শ। ভাবছেন কেন এই উত্তরটি আর কেউ আপত্তি করেনি !!
এক্স-ট্রেমে

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

রায়ান ব্রুকস এখন এটি কীভাবে করবেন সে সম্পর্কে একটি নিবন্ধ লিখেছেন ।
টোনিক আর্টস

দুর্দান্ত পরামর্শ। কেন এই উত্তরটি এতদূর পৃষ্ঠায় নিচে রয়েছে যে এটি সন্ধান করতে আমাকে নীচে স্ক্রোল করতে হবে? এটি একেবারে শীর্ষে দেখানো উচিত যাতে আরও বেশি লোক এই সুন্দর উত্তরটি আরও সহজে খুঁজে পেতে পারে।
রেস্টইনপিস

4
রায়ান ব্রুকস তার পাঠাগারটিকে অবচয় হিসাবে চিহ্নিত করেছে marked আমি অবাক হই যে এটি ঠিক যে তিনি সমর্থন করা বন্ধ করেছেন বা এটি প্রমাণিত হয়েছে যে এই পদ্ধতির কোনও কিছু ভেঙে গেছে বা স্মৃতি ফাঁস বা স্টেমেট সৃষ্টি করেছে ...
ভার্বারা কালিনিনা

6

থেকে নমুনা কোড বাস্তবায়ন করুন এখানে

ভিউহোল্ডারের অন ক্লিকের ভিতরে মান মানচিত্র নির্ধারণ করুন

@Override
public void onClick(final View view) {
    if (mOriginalHeight == 0) {
        mOriginalHeight = view.getHeight();
    }
    ValueAnimator valueAnimator;
    if (!mIsViewExpanded) {
        mIsViewExpanded = true;
        valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5));
    } else {
        mIsViewExpanded = false;
        valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight);
    }
    valueAnimator.setDuration(300);
    valueAnimator.setInterpolator(new LinearInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            view.getLayoutParams().height = value.intValue();
            view.requestLayout();
        }
    });
    valueAnimator.start();

}

এখানে চূড়ান্ত কোড

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView mFriendName;
    private int mOriginalHeight = 0;
    private boolean mIsViewExpanded = false;


    public ViewHolder(RelativeLayout v) {
        super(v);
        mFriendName = (TextView) v.findViewById(R.id.friendName);
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(final View view) {
        if (mOriginalHeight == 0) {
            mOriginalHeight = view.getHeight();
        }
        ValueAnimator valueAnimator;
        if (!mIsViewExpanded) {
            mIsViewExpanded = true;
            valueAnimator = ValueAnimator.ofInt(mOriginalHeight, mOriginalHeight + (int) (mOriginalHeight * 1.5));
        } else {
            mIsViewExpanded = false;
            valueAnimator = ValueAnimator.ofInt(mOriginalHeight + (int) (mOriginalHeight * 1.5), mOriginalHeight);
        }
        valueAnimator.setDuration(300);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer value = (Integer) animation.getAnimatedValue();
                view.getLayoutParams().height = value.intValue();
                view.requestLayout();
            }
        });
        valueAnimator.start();

    }
}

11
এটি "মত ExpandableListView" কাজ করে না , কারণ এ ক্ষেত্রে প্রসারিত সামগ্রীটি অ্যাডাপ্টারের থেকে আসা আইটেমগুলির সাথে একটি তালিকা। এটি একটি অধঃপতিত সমাধান যা কেবলমাত্র 1 টি আইটেমটিকে গ্রুপের অভ্যন্তরে শিশু হিসাবে অনুমোদিত।
TWiStErRob


এটি সঠিকভাবে কাজ করে না কারণ রিসাইক্লারলিস্টে দৃশ্যটি একাধিকবার পুনরাবৃত্তি হতে পারে, সুতরাং আপনি যখন কোনও আইটেম প্রসারিত করবেন আপনি তালিকার একাধিক আইটেম প্রসারিত
দেখবেন

3

https://github.com/gabrielemariotti/cardslib

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


4
এই প্রসারণযোগ্য কার্ডের তালিকাটি রিসাইক্লার ভিউয়ের বাচ্চা নয় (এটি রিসাইক্লারভিউকে প্রসারিত করে না, এটি কেবল
এক্সপ্যানডেবললিস্টভিউ

0

কেউ অভিযোগ করেছেন যে উপরে বর্ণিত সমাধানটি প্রসারণযোগ্য সামগ্রী হিসাবে তালিকার সাথে ব্যবহারযোগ্য নয়। তবে একটি সহজ সমাধান রয়েছে: একটি তালিকা ভিউ তৈরি করুন এবং এই তালিকাটি আপনার সারি দিয়ে ম্যানুয়ালি পূরণ করুন

অলসদের জন্য সমাধান: আপনি যদি নিজের কোডটি খুব বেশি পরিবর্তন করতে না চান তবে একটি সহজ সমাধান রয়েছে। দর্শন তৈরি করতে এবং এগুলিতে যুক্ত করতে কেবল নিজের অ্যাডাপ্টারটি ম্যানুয়ালি ব্যবহার করুনLinearLayout

উদাহরণটি এখানে:

if (mIsExpanded)
{
    // llExpandable... is the expandable nested LinearLayout
    llExpandable.removeAllViews();
    final ArrayAdapter<?> adapter = ... // create your adapter as if you would use it for a ListView
    for (int i = 0; i < adapter.getCount(); i++)
    {
        View item = adapter.getView(i, null, null);
        // if you want the item to be selectable as if it would be in a default ListView, then you can add following code as well:
        item.setBackgroundResource(Functions.getThemeReference(context, android.R.attr.selectableItemBackground));
        item.setTag(i);
        item.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // item would be retrieved with: 
                // adapter.getItem((Integer)v.getTag())
            }
        });
        llExpandable.addView(item);
    }
    ExpandUtils.expand(llExpandable, null, 500);
}
else
{
    ExpandUtils.collapse(llExpandable, null, 500);
}

সহায়ক ফাংশন: getThemeReferences

public static int getThemeReference(Context context, int attribute)
{
    TypedValue typeValue = new TypedValue();
    context.getTheme().resolveAttribute(attribute, typeValue, false);
    if (typeValue.type == TypedValue.TYPE_REFERENCE)
    {
        int ref = typeValue.data;
        return ref;
    }
    else
    {
        return -1;
    }
}

সহায়ক শ্রেণি: সম্প্রসারণ সামগ্রী

কাভিন ভারনান ইতিমধ্যে কীভাবে একটি বিন্যাসটি অ্যানিমেট করতে হবে তা পোস্ট করে ... তবে আপনি যদি আমার ক্লাসটি ব্যবহার করতে চান তবে নিঃসঙ্কোচে বলুন, আমি একটি টুকরো পোস্ট করেছি: https://gist.github.com/MichaelFlisar/738dfa03a1579cc7338a


9
"অলস সমাধান" সত্যিই খারাপ ধারণা। কোনও স্ক্রোলযোগ্য ভিউয়ের মধ্যে লিনিয়ারলেআউটে ভিউগুলি যুক্ত করা এতটা অক্ষম।
ম্যাথু

আমি মনে করি এটি ব্যবহারের চেয়ে কমপক্ষে আরও বেশি। আমি এটি পরীক্ষা করেছি এমন সমস্ত ডিভাইসে দ্রুত মসৃণ কাজ করে। যাইহোক, তালিকা ভিউটি দৃশ্যমান না হলে দৃশ্যগুলি যুক্ত করা হয় ... কেবলমাত্র ইতিমধ্যে পূরণ করা তালিকার ভিউ পরে প্রদর্শিত হবে ...
85

এই ছিল ঝরঝরে! অনেক ধন্যবাদ
পবন কুমার

4
@ ম্যাথু যেমন উল্লেখ করেছেন, এটি সত্যিই ভাল ধারণা নয়। একক বৃহত স্ক্রোলযোগ্য দর্শন ডাব্লু / লিনিয়ারলআউটগুলি ভাল স্কেল করে না। রিসাইক্লারভিউ / তালিকাভিউ এবং অন্যান্য অনুরূপ মতামত লিখিত হওয়ার সবচেয়ে বড় কারণগুলির মধ্যে একটি হ'ল অজানা আকারের বৃহত ডেটা-ব্যাকড তালিকা থাকা অনুকূলিতকরণ। একক ভিউ তৈরি করা / একগুচ্ছ দর্শন যুক্ত করা সমস্ত সরবরাহিত অপ্টিমাইজেশনকে ছুঁড়ে ফেলে। পুনর্ব্যবহারযোগ্য দর্শনগুলি একটি বিশাল উপকার এবং আপনার অ্যাপ্লিকেশন মেমরিটিকে দক্ষ করে তোলে। আইটেমের সংখ্যা ছোট না হলে ভিউ বাইন্ডিং পরিচালনা করতে তালিকাগুলি ব্যবহার করে অনেক কাজ বাঁচানো হয়।
মুঙ্কে

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

0

আপনি প্রসারণযোগ্য লেআউটটি ব্যবহার করতে পারেন যা মসৃণ প্রসারিত / ধসের অ্যানিমেশন চেকবক্সের মতো হয়, তাই আপনি এটিকে তালিকাভিউ এবং রিসাইক্লারভিউতে চেকবক্স হিসাবে ব্যবহার করতে পারেন।

https://github.com/KyoSherlock/ExpandableLayout


0

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

1) অনক্লিকের জন্য নিবন্ধন করতে আপনার onCreateViewHolder () এর মধ্যে শ্রোতা যুক্ত করুন

2) আপনার অ্যাডাপ্টারের অভ্যন্তরে আপনার কাস্টম অনক্লিকলিস্টনার তৈরি করুন

private View.OnClickListener mItemListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        TextView tv = (TextView) v.findViewById(R.id.tvItems);
        String selected = tv.getText().toString();
        boolean checked = itemsList.get(recyclerView.getChildAdapterPosition(v)).isChecked();

        switch (selected){
            case "Item1":
                if(checked){
                    deleteItem(v);
                    itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(false);
                }else {
                    addItem(v);
                    itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(true);
                }
                break;
            case "Item2":
                if(checked){
                    deleteItem(v);
                    itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(false);
                }else {
                    addItem(v);
                    itemsList.get(recyclerView.getChildAdapterPosition(v)).setChecked(true);
                }
                break;                 
            default:
                //In my case I have checkList in subItems,
                //checkItem(v);
                break;
        }
    }
};

3) আপনার অ্যাড আইটেম () এবং মুছুন আইটেম () যুক্ত করুন

private void addItem(View view){
    int position = recyclerView.getChildLayoutPosition(view);
    if (position != RecyclerView.NO_POSITION){
        navDrawItems.add(position+1,new mObject());
        navDrawItems.add(position+2,new mObject());
        notifyItemRangeInserted(position+1,2);
    }
}


private void deleteItem(View view) {
    int position = recyclerView.getChildLayoutPosition(view);
    if (position != RecyclerView.NO_POSITION) {
        navDrawItems.remove(position+2);
        navDrawItems.remove(position+1);
        notifyItemRangeRemoved(position+1,2);
    }
}

৪) যদি আপনার রিসাইক্লারভিউ অ্যাডাপ্টারটি পুনর্ব্যবহারযোগ্য ভিউয়ের মতো ক্রিয়াকলাপে না থাকে , তৈরি করার সময় পুনর্ব্যবহারযোগ্য দৃষ্টান্তটি অ্যাডাপ্টারে পাস করুন

৫) আইটেমলিস্ট হ'ল এমওজেক্ট টাইপের একটি অ্যারেলিস্ট যা আইটেমের স্টেটস (ওপেন / ক্লোজ), নাম, আইটেমের ধরণ (সাবআইটেম / মেইন আইটেম) বজায় রাখতে এবং থিমকে মানগুলির উপর ভিত্তি করে সেট করতে সহায়তা করে helps

public class mObject{
    private String label;
    private int type;
    private boolean checked;
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.