কার্ডভিউ লেআউট_উইথ = "ম্যাচ_পিতা" প্যারেন্ট রিসাইক্লারভিউ প্রস্থের সাথে মেলে না


123

আমার একটি খণ্ড রয়েছে যার সাথে একটি পুনর্ব্যবহারযোগ্য ভিউ রয়েছে = "ম্যাচ_পিতা":

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment" />

পুনর্ব্যবহারযোগ্য আইটেমটি লেআউট_উইথ = "ম্যাচ_প্যারেন্ট" সহ একটি কার্ডভিউও রয়েছে:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:layout_gravity="center"
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent"
        android:textAppearance="?android:textAppearanceLarge"/>
</android.support.v7.widget.CardView>

আমি নীচে হিসাবে আইটেম ভিউ স্ফীত:

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        CardView v = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_listitem, null, true);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

তবে আমি যখন অ্যাপটি চালাচ্ছি, কার্ডভিউটি নীচের চিত্রের মতো মোড়ানো_ কনটেন্ট হিসাবে রেন্ডার করা হবে:

CardsBug

মনে রাখবেন যে এটি এমুলেটরটিতে চালিত হয়েছিল, কোনও আসল ডিভাইস নয়।

আমি কি কিছু ভুল করছি, বা এটি একটি বাগ?


কার্ডভিউ স্ফীত করার সময়, আপনি কি সত্য প্যারামিটার দিয়ে পিতামাতার ভিউ সরবরাহ করছেন?
nhaarman

হাই @ নাইকহর্মন, সম্পাদনাটি দেখুন। আমি স্ফীতকরণ কোড যুক্ত করেছি। এবং হ্যাঁ আমি সত্য পরামিতিটি পাস করেছি।
প্রোগ্র্যামার

উত্তর:


291

এর জন্য দস্তাবেজগুলি inflate:

নির্দিষ্ট এক্সএমএল সংস্থান থেকে একটি নতুন দর্শন শ্রেণিবিন্যাস স্ফীত করুন। যদি কোনও ত্রুটি থাকে তবে InflateException ছুঁড়ে দেয়।

পরামিতি
রিসোর্স লোড একটি XML বিন্যাস রিসোর্স (যেমন, R.layout.main_page) রুট জন্য আইডি
দৃশ্য উত্পন্ন অনুক্রমের অভিভাবক হতে (যদি attachToRoot সত্য), বা অন্য কেবল একটি বস্তু রুট জন্য LayoutParams মূল্যবোধের একটি সেট প্রদান করে ফিরে শ্রেণীবিন্যাসের (যদি attachToRoot মিথ্যা। হয়)
attachToRoot কিনা স্ফীত অনুক্রমের রুট প্যারামিটার সংযুক্ত করা উচিত? যদি মিথ্যা হয় তবে এক্সএমএলটিতে মূল দেখার জন্য লেআউটপ্যারামগুলির সঠিক সাবক্লাস তৈরি করতে মূল ব্যবহার করা হয়। স্ফীত শ্রেণিবিন্যাসের মূল দৃশ্যটি দেখায়। যদি রুট সরবরাহ করা হয়েছিল এবং সংযুক্তিট্রু রুটটি সত্য হয় তবে এটি মূল; অন্যথায় এটি স্ফীত এক্সএমএল ফাইলের মূল।

এখানে গুরুত্বপূর্ণ হল না সত্য সরবরাহ, কিন্তু না পিতা বা মাতা: সরবরাহ

LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

সাপলাইং parentদেখুন inflater জানা কি ব্যবহার layoutparams করতে দেয়। সাপলাইং falseপ্যারামিটার বলে এটি না এখনও অভিভাবক তা জোড়া। এটা RecyclerViewআপনার জন্য ইচ্ছা কি।


4
সমাধানটি আমার পক্ষে কার্যকর হয়নি কারণ তালিকার ভিউ layout_widthছিল wrap_content। এটি অদ্ভুত কারণ এটি তালিকার ভিউটিতে প্রভাব ফেলবে না! সুতরাং আমার বোধগম্যতা হল আপনি যখন লেআউটইনফ্লেটারে প্যারামিটার হিসাবে মিথ্যা সরবরাহ করেন, তালিকাভিউ নিজেই তালিকার সাথে মিলে থাকা লেআউট প্যারামিটারগুলির সাথে তালিকার ভিউগুলিতে তালিকা আইটেম যুক্ত করে! : 0
রবিউজনহোনে

1
আপনি কি আরও কিছু কোড পোস্ট করতে পারেন, কারণ আমি মনে করি যে আমিও তাই করছি তবে বাস্তবে এটি কাজ করছে না
rodi

1
আপনার পরামর্শ এবং ম্যাচ পিতা বা মাতা আমার পক্ষে কীভাবে কাজ করছে না তা আমি উদ্বুদ্ধ করছি।
জ্যাপনোলজিকা

3
আমার মনে হয় সঠিক বোঝাপড়াটি হ'ল আপনি যখন সংযুক্তি-ট্রুটকে মিথ্যা হিসাবে সেট করেন, আপনাকে সংজ্ঞায়িত লেআউটপ্যারাম মান সহ কোনও বস্তু সরবরাহ করতে হবে। এই বস্তুটি পিতামাতার অগত্যা নয়। "... কেবলমাত্র এমন একটি বস্তু যা প্রত্যাবর্তিত শ্রেণিবদ্ধের মূলের জন্য লেআউটপ্যারাম মানগুলির একটি সেট সরবরাহ করে (যদি সংযুক্তিটিওরুটটি মিথ্যা হয়)) ..." তবে আমি বুঝতে পারছি না কেন কার্ডটি ভিউতে সংজ্ঞায়িত লেআউটপ্যারামগুলি প্রয়োজন বোধ করে তবে প্রয়োজন অন্য অবজেক্টের প্যারামিটার তা জানাতে?
hjchin

1
আমি যদি কাস্টম ভিউ ব্যবহার করি তবে কীভাবে এটি মোকাবেলা করব? আমার অর্থViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
ক্রস

65

কার্ডভিউতে তাত্ক্ষণিক অভিভাবক হিসাবে রিলেটিভলয়েট ব্যবহার করুন।

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>

হ্যাঁ এটি আমার পক্ষেও কাজ করবে বলে মনে হয়েছিল। আমি লিনিয়ারলআউট ব্যবহার করছিলাম এবং উপরের পরামর্শটি কার্যকর হয়নি যেহেতু আমি ইতিমধ্যে ঠিক এমনটি করছিলাম (যেমন মূলের সাথে সংযুক্ত হওয়া নয়, তবে একটি পিতামাতার সরবরাহ করা)। আপনাকে RelativeLayout + পিতামাতাকে সংযুক্ত না করে একটি প্রদান করা, উভয়ই করতে হবে।
চুবসন্ডবস

1
এটি আমার পক্ষে কাজ করে তবে আমি কেন জানি না কেন এটি সমস্যার সমাধান করতে পারে। কেন কেউ ব্যাখ্যা করতে পারে?
জনি

1
এটি যুগ যুগ ধরে, অ্যান্ড্রয়েড এক্স উত্পাদনে রয়েছে, তবুও বাগটি ঠিক করা হয়নি!
মুহাম্মদ নাদেরি


আমারও অনুরূপ সমস্যা ছিল এবং এটি আমার কার্ড দর্শনের প্রস্থটি সংশোধন করার জন্য কাজ করেছিল তবে উচ্চতা নিয়ে আমারও একই সমস্যা হচ্ছে? আপনি কি তার জন্য আমাকে কিছু প্রস্তাব দিতে পারেন?

12

এটি আমার পক্ষে কাজ করেছে,

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, null, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 return new ViewOffersHolder(viewHolder);

6

আমি যেভাবে এটি করেছি তা হ'ল:

View view = mInflater.inflate(R.layout.row_cardview, null, true);
            WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            int width = windowManager.getDefaultDisplay().getWidth();
            view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT));

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


1
দয়া করে এটিকে কিছুটা উন্নত করুন। এটি মূলত বলেন, "এই ব্যবহার করে দেখুন"
ড্রিউ

যোগ করা হয়েছে ব্যাখ্যা। দয়া করে চেক করুন এবং যদি আরও কোনও সহায়তার প্রয়োজন হয় তবে এখানে মন্তব্য করুন।
রাহুল


4

কেবল নতুন লেআউট প্যারাম সেট করুন

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));

কনস্ট্র্যান্টলয়েট থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি কাস্টম ভিউ ক্লাস ব্যবহার করার সময় আমি অনবিন্দ ভিউহোল্ডার () এ দরকারী বলে মনে করেছি।
রাসমুসব

এটি ভাল উত্তর নয় কারণ লেআউটে সেট করা মার্জিনটি প্রভাবিত হবে।
এমি রাজ

4

ডিফল্ট বাস্তবায়ন ডিফল্ট লেআউট ম্যানেজারে মোড়ানো_ কনটেন্ট ব্যবহার করতে বাধ্য করে :

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

আপনাকে যা করতে হবে তা হ'ল আপনার লেআউটম্যানেজারে এই পদ্ধতিটিকে ওভাররাইড করা:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

2

এটি আমার পক্ষে কাজ করে

View view = inflator.inflate(R.layout.layout_item, ***null***, false);

1

কার্ড_ভিউ ব্যবহার করুন: একটি নেতিবাচক মান সহ কন্টেন্টপ্যাডিং

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    card_view:contentPadding="-4dp"
    card_view:cardElevation="0dp"
    android:layout_height="wrap_content">

এটা আমার জন্য কাজ করেছে


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