webentwicklung-frage-antwort-db.com.de

Viewpager wird nicht in der RecyclerView-Zeile angezeigt

Ich möchte eine Fotodetails-Aktivität oder ein Fragment erstellen, bei dem das Foto darüber und darunter ein aViewpPager angezeigt wird, in dem sowohl Kommentare als auch ähnliche Fotos des zugehörigen Fotos (2 Registerkarten) angezeigt werden. Ich kann also sowohl nach Kommentaren als auch nach links und rechts scrollen. Ich entschied mich für eine RecyclerView mit 2 Zeilen:

REIHE 1: Das Foto (ImageView).

ROW 2: SlidingTabLayout + ViewPager + FragmentPagerAdapter.

Der Code wird kompiliert und ausgeführt, zeigt das Bild und das SlideTabLayout an, jedoch nicht den ViewPager.

Meine zwei Hauptfragen sind also:

1-Was ist falsch an meiner Implementierung?.

2-Gibt es eine alternative oder bessere Lösung für das, was ich erreichen möchte?

Hinweis: Ich möchte keine ListView mit Header verwenden. Ich möchte RecyclerView verwenden, da es einfacher ist, Elemente vom oberen/unteren Rand aus dem Netzwerk hinzuzufügen.

PhotoDetailsActivity.Java

public class MainActivity extends ActionBarActivity {
    RecyclerView recyclerViewPhotoDetails;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.recyclerViewPhotoDetails = (RecyclerView) this.findViewById(R.id.recycler_view_photo_details);
        this.recyclerViewPhotoDetails.setLayoutManager(new LinearLayoutManager(this));
        this.recyclerViewPhotoDetails.setAdapter(new PhotoDetailsRecyclerAdapter(this.getSupportFragmentManager()));
    }
}

FotosDetailsRecyclerAdapter.Java

public class PhotoDetailsRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int ROW_IMAGE = 0;
    private static final int ROW_LIKES_AND_COMMENTS = 1;
    private static final int TOTAL_ROWS = 2;

    private FragmentManager fragmentManager;

    public PhotoDetailsRecyclerAdapter(FragmentManager fragmentManager) {
        this.fragmentManager = fragmentManager;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return ROW_IMAGE;
        } else {
            return ROW_LIKES_AND_COMMENTS;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(viewType == ROW_IMAGE) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_image, parent, false);
            return new ImageViewHolder(view);
        } else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_comments_and_likes, parent, false);
            return new CommentsAndLikesViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
    }

    @Override
    public int getItemCount() {
        return TOTAL_ROWS;
    }

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

    public class CommentsAndLikesViewHolder extends RecyclerView.ViewHolder {
        private SlidingTabLayout slidingTabLayout;
        private ViewPager viewPager;

        public CommentsAndLikesViewHolder(View view) {
            super(view);

            slidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tab_layout_comments_and_likes);
            viewPager = (ViewPager) view.findViewById(R.id.view_pager_comments_and_likes);

            viewPager.setAdapter(new CommentsAndLikesPagerAdapter(fragmentManager));
            slidingTabLayout.setDistributeEvenly(true);
            slidingTabLayout.setViewPager(viewPager);
        }
    }
}

activity_main.xml

<Android.support.v7.widget.RecyclerView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/recycler_view_photo_details"
    Android:scrollbars="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    />

layout_image.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    >

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:adjustViewBounds="true"
        Android:scaleType="centerCrop"
        Android:src="@drawable/img"
        />

</FrameLayout>

layout_comments_and_likes.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    >

    <org.bitbucket.androidapp.SlidingTabLayout
        Android:id="@+id/sliding_tab_layout_comments_and_likes"
        Android:layout_width="match_parent"
        Android:layout_height="48dp"
        Android:background="@Android:color/darker_gray"
        />

    <Android.support.v4.view.ViewPager
        Android:id="@+id/view_pager_comments_and_likes"
        Android:layout_height="match_parent"
        Android:layout_width="match_parent"
        Android:background="@Android:color/holo_blue_dark"
        />

</LinearLayout>

KommentareAndLikesPagerAdapter.Java

public class CommentsAndLikesPagerAdapter extends FragmentPagerAdapter {
    private static final int TOTAL_TABS = 2;

    private String[] tabs = { "comments", "likes" };

    public CommentsAndLikesPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0) {
            return new CommentsFragment();
        } else {
            return new LikesFragment();
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabs[position];
    }

    @Override
    public int getCount() {
        return TOTAL_TABS;
    }
}

KommentareFragment.Java

 public class CommentsFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_comments, container, false);
        RecyclerView recyclerViewComments = (RecyclerView) view.findViewById(R.id.recycler_view_comments);
        recyclerViewComments.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        recyclerViewComments.setAdapter(new CommentsRecyclerAdapter());
        return view;
    }
}

fragment_comments.xml

<Android.support.v7.widget.RecyclerView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/recycler_view_comments"
    Android:scrollbars="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    />

LikesFragment.Java

public class LikesFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_likes, container, false);
        RecyclerView recyclerViewLikes = (RecyclerView) view.findViewById(R.id.recycler_view_likes);
        recyclerViewLikes.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        recyclerViewLikes.setAdapter(new LikesRecyclerAdapter());
        return view;
    }
}

fragment_likes.xml

<Android.support.v7.widget.RecyclerView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/recycler_view_likes"
    Android:scrollbars="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    />

layout_comment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="Comment"
        />

</RelativeLayout>

layout_like.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="Like"
        />

</RelativeLayout>
19

Ich bin mit diesem Problem konfrontiert und dieses Problem mit der Set-ID für jeden ViewPager gelöst:) ViewPager erlaubt keine gemeinsame Nutzung der ID in demselben Fragment, auch wenn diese Teil eines Recyclerview-Kontexts ist. 

pagerHolder.pager.setId(position);
34
Linh Nguyen

Aktualisieren Sie die ViewPager-Höhe. Die Elemente des RecyclerView benötigen eine bestimmte Höhe 

<Android.support.v4.view.ViewPager
    Android:id="@+id/view_pager"
    Android:layout_height="300dp"
    Android:layout_width="match_parent"
    Android:background="@Android:color/holo_blue_dark" />

Sie können diesen Code anzeigen und Ihren Code aktualisieren. Ich habe diesen Code für mein Projekt verwendet und gearbeitet. Sie müssen ViewPagerAdapter so einstellen, dass Viewpager in der onBinViewHolder-Methode angezeigt wird. Wenn es nicht funktioniert, möchte ich helfen.

RecylerviewAdapter

    // Replace the contents of a view (invoked by the layout manager)
   @Override
   public void onBindViewHolder(ViewHolder holder, int position) {
      // - get element from your dataset at this position
      // - replace the contents of the view with that element
      initializeViews("Mustafa", holder, position);
   }

   private void initializeViews(final String object, final ViewHolder holder, int position) {
      holder.textViewCount.setText("5");
      holder.imageViewStar.setImageResource(R.drawable.info);
      holder.imageViewFavorite.setImageResource(R.drawable.info);
      ViewPagerBoundariesAdapter adapter = new ViewPagerBoundariesAdapter(activity, new ArrayList<ViewPagerItem>(), listener);
      holder.viewPager.setAdapter(adapter);
      holder.viewPager.setClipToPadding(false);
      holder.viewPager.setPadding(40, 0, 40, 0);
   }

ViewPagerAdapter

/**
 * Created by MustafaS on 10.3.2015.
 */
public class ViewPagerBoundariesAdapter extends PagerAdapter {
   private ArrayList<ViewPagerItem>    pagerItems;
   private LayoutInflater              inflater;
   private Context                     context;
   private ViewPagerItemClickInterface listener;

   public ViewPagerBoundariesAdapter(Context context, ArrayList<ViewPagerItem> pagerItems, ViewPagerItemClickInterface callback) {
      super();
      this.pagerItems = pagerItems;
      this.context = context;
      this.listener = callback;
      inflater = LayoutInflater.from(context);
   }

   @Override
   public Object instantiateItem(ViewGroup container, int position) {

      LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.row_viewpager, container, false);
      ImageView imageViewCampaign = (ImageView) layout.findViewById(R.id.imageview_campaign);
      TextView textViewCampaign = (TextView) layout.findViewById(R.id.textview_campaign);
      imageViewCampaign.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            listener.onViewPagerItemClick(1);
         }
      });
      // textViewCampaign.setText("Lorem ipsum dolor sit amet\n" + "aliquam nec nisi in lorem");
      imageViewCampaign.setImageDrawable(context.getResources().getDrawable(R.drawable.nusret));
      container.addView(layout);
      return layout;
   }

   @Override
   public void destroyItem(ViewGroup container, int position, Object object) {
      ((ViewPager) container).removeView((View) object);
   }

   @Override
   public int getCount() {
      return 5;
   }

   @Override
   public boolean isViewFromObject(View view, Object obj) {
      return view.equals(obj);
   }

}

recylerview xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">
    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/listview_brand"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />
</LinearLayout>

recylerview row xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginBottom="8dp"
        Android:layout_marginLeft="8dp"
        Android:orientation="horizontal">

        <ImageView
            Android:id="@+id/imageview_favorite"
            Android:layout_width="32dp"
            Android:layout_height="32dp"
            Android:layout_gravity="center" />

        <TextView
            Android:id="@+id/textview_brand_name"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:gravity="center_vertical"
            Android:paddingLeft="8dp"
            Android:text="Gucci"
            Android:textSize="@dimen/standart_text_size" />

        <FrameLayout
            Android:layout_width="32dp"
            Android:layout_height="32dp"
            Android:layout_marginRight="8dp">

            <ImageView
                Android:id="@+id/imageview_star"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent" />

            <TextView
                Android:id="@+id/textview_count"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center"
                Android:ellipsize="end"
                Android:gravity="center"
                Android:singleLine="true"
                Android:textSize="@dimen/standart_text_size" />
        </FrameLayout>
    </LinearLayout>

    <Android.support.v4.view.ViewPager
        Android:id="@+id/pager"
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/pager_image_and_text_height" />
</LinearLayout>

Viewpager-Zeilen-XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <ImageView
        Android:id="@+id/imageview_campaign"
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/parallax_image_height"
        Android:layout_marginLeft="4dp"
        Android:layout_marginRight="4dp"
        Android:adjustViewBounds="true"
        Android:scaleType="centerCrop" />

    <TextView
        Android:id="@+id/textview_campaign"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:paddingLeft="4dp"
        Android:paddingRight="4dp"
        Android:paddingTop="8dp"
        Android:text="Lorem ipsum dolor sit amet
aliquam nec nisi in lorem"
        Android:textSize="@dimen/standart_text_size" />
</LinearLayout>
3
mustafasevgi

Ich hatte das gleiche Problem und las alle Antworten hier durch. Ich werde beschreiben, wie ich das löse.

Nur ein wenig Hintergrund. Ich habe einen Viewpager mit Registerkarten oben, der beim Starten der App 3 Fragmente anzeigt.

In einem der Fragmente befindet sich eine Recyclingübersicht mit einem Viewpager als einem der Elemente in der Ansicht - nennen wir das Fragment A:

Ich rufe dies in Fragment A auf, um den RECYCLERVIEW-Adapter einzustellen:

FragmentOuterAdapter fragmentOuterAdapter  = new FragmentOuterAdapter(getActivity(), this ); //this here refers to Fragment A - note this as this is IMPORTANT
mRecyclerView.setAdapter(fragmentOuterAdapter);

In meinem RECYCLERVIEW-Adapter rufe ich Folgendes an, um den viewHolder zu erstellen:

class ViewPagerViewHolder extends RecyclerView.ViewHolder {
    ViewPager viewPager;
    public ViewPagerViewHolder(View view) {
        super(view);
        viewPager = (ViewPager) view.findViewById(R.id.viewPager);
    }
}

Unter onCreateViewHolder initialisiere ich die Ansicht und bekomme einen Überblick.

Der wichtige Code kommt unter onBindViewHolder:

        FragmentManager fragmentManager = fragment.getChildFragmentManager();
        ((ViewPagerViewHolder) holder).viewPager.setAdapter(new SubViewFragmentPagerAdapter(fragmentManager));

Das Fragment-Objekt, das in FragmentOuterAdapter übergeben wurde, wird hier angezeigt, wo ich das Objekt für getChildFragmentManager () verwende.

Da Sie ein Fragment innerhalb eines Fragments DURCH den Viewpager anzeigen, müssen Sie anstelle des Fragmentmanagers den untergeordneten Fragmentmanager verwenden.

Dadurch wird der Viewpager funktioniert.

2
Simon

Stellen Sie Ihren ViewPager auf eine fest codierte Höhe ein und nicht auf Wrap-Inhalt oder übergeordnetes Element. Ich hatte ein seltsames Problem, bei dem mein Bildschirm leer war, obwohl mein ViewPager gefüllt war.

0
user2403795

Als zweite Zeile müssen Sie ein lineares Layout verwenden und darin den Ansichts-Pager zusammen mit dem Tabhost-Widget hinzufügen, das die Kommentare und Likes zeigt.

Sie können die Bibliothek https://github.com/daimajia/AndroidSwipeLayout hier verwenden, um den gleichen Effekt auf einfachere Weise zu erzielen.

Ich könnte mehr Details angeben, wenn Sie interessiert sind.

0
codename_47

Für mich ist es am besten, etwas Neues aus der Android Support Library v7 zu verwenden, indem Sie Horizontal Recyclerview mit PagerSnapHelper verwenden, um ähnliche Ergebnisse zu erzielen wie ViewPager

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerview.setLayoutManager(new LinearLayoutManager(context,
                        LinearLayoutManager.HORIZONTAL,false));
recyclerview.setAdapter(adapter);
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
0
Shyam Sunder

Die Antwort von Linh Nguyen regelte es für mich, obwohl ich einen etwas anderen Fall als die ursprüngliche Frage hatte.

In einer Aktivität hatte ich RecyclerView mit Zeilen:
ROW1: ViewPager mit X-Bildern (layout_height="200dp")
ROW2: Text
ROW3: ViewPager mit Y-Bildern (layout_height="100dp")
...

Da ich dasselbe Layout für ROW1 und ROW3 wiederverwendete, hatten beide ViewPagers den gleichen @+id.
Der ViewPager in ROW1 hat gut funktioniert.
ViewPager in ROW3 verhielt sich jedoch wie folgt:

  • Beim erstmaligen Laden des Bildschirms wird die ViewPager-Seitenerstellungsmethode aufgerufen (onCreateView() für die erste und die zwei umgebenden Seiten/Fragmente von ViewPager in ROW3).
  • Es schien, als ob nichts gerendert wurde (leere Seiten)

Aber dann bemerkte ich, dass ich, wenn ich mehr als 5 Bilder in ROW3 hatte, durch leere Seiten streichen konnte und schließlich Seiten 3, 4 usw. sehen konnte. Wenn ich am Ende angelangt bin, würde das Zurückkehren zu den Seiten 2 und 1 ordnungsgemäß erstellt werden (da sie neu erstellt wurden).

Nachdem Sie ViewPager in ROW3 eine eindeutige ID zugewiesen hatten, funktionierte alles einwandfrei.

0
trav3ll3r