0

Ich versuche, verschiedene Layouts im selben RecyclerView-Adapter aufzublasen. Ich Fetching Daten vom Server und hier ist die Antwort wie folgt aussieht:Verschiedene Layouts im selben RecyclerView-Adapter aufblasen

[ 
    { 
    "id": 1, 
    "title": "test", 
    "content_text": "this is just for testing\r\n", 
    "content_audio": "", 
    "content_video": "", 
    "language": "english", 
    "images": [] 
    }, 
    { 
    "id": 2, 
    "title": "test", 
    "content_text": "this is just for testing\r\n", 
    "content_audio": "", 
    "content_video": "", 
    "language": "english", 
    "images": [] 
    }, 
    { 
    "id": 3, 
    "title": "test", 
    "content_text": "this is just for testing\r\n", 
    "content_audio": "", 
    "content_video": "", 
    "language": "english", 
    "images": [] 
    }, 
    { 
    "id": 4, 
    "title": "test", 
    "content_text": "this is just for testing\r\n", 
    "content_audio": "", 
    "content_video": "", 
    "language": "english", 
    "images": [] 
    }, 
    { 
    "id": 5, 
    "title": "test", 
    "content_text": "this is just for testing\r\n", 
    "content_audio": "", 
    "content_video": "", 
    "language": "english", 
    "images": [ 
     { 
     "id": 1, 
     "timeline_id": 5, 
     "image": "uploads/islamicContent/e23ae768bea547ccf5df10533e5a4f56.jpg" 
     }, 
     { 
     "id": 2, 
     "timeline_id": 5, 
     "image": "uploads/islamicContent/64d45166442f6ebfee11777a0ce364d0.jpg" 
     }, 
     { 
     "id": 3, 
     "timeline_id": 5, 
     "image": "uploads/islamicContent/01c924e77b37264fe00197c316cddbd3.jpg" 
     } 
    ] 
    } 
] 

My Screen sollte Beiträge, Bilder und Videos (Wie FB Timeline) haben. Problem ist, wenn ich meinen Code auf meinem Gerät starte, scheint es, dass der Adapter nichts aufblasen außer Text "Beiträge" nur (keine Bilder erscheint), aber wenn wir einen Blick auf Antwort werfen, sollte es 5 Beiträge dann 3 Bilder zeigen.

Mein IslamicTimeline Adapter wie folgt aussieht:

public class IslamicTimelineAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private List<IslamicTimelineResponse> islamicList = Collections.emptyList(); 
    private Activity context; 
    private LayoutInflater inflater; 

    public IslamicTimelineAdapter(Activity mContext) { 
     this.context = mContext; 
     this.islamicList = new ArrayList<>(); 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (islamicList.get(position).postContent.length() > 0 && islamicList.get(position).postContent != null) 
      return ISLAMIC_POST; 
     else if (islamicList.get(position).postImages.size() > 0 && islamicList.get(position).postImages != null) 
      return ISLAMIC_IMAGE; 
     else if (islamicList.get(position).postVideoUrl.length() > 0 && islamicList.get(position).postVideoUrl != null) 
      return ISLAMIC_VIDEO; 

     return -1; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder viewHolder = null; 
     switch (viewType) { 
      case ISLAMIC_POST: 
       View postRow = inflater.inflate(R.layout.index_islamic_timeline_posts, parent, false); 
       viewHolder = new IslamicTimelinePostHolder(postRow); 
       break; 

      case ISLAMIC_IMAGE: 
       View imageRow = inflater.inflate(R.layout.index_islamic_timeline_images, parent, false); 
       viewHolder = new IslamicTimelineImageHolder(imageRow); 
       break; 

      case ISLAMIC_VIDEO: 
       View videoRow = inflater.inflate(R.layout.index_islamic_timeline_videos, parent, false); 
       viewHolder = new IslamicTimelineVideoHolder(videoRow); 
       break; 

     } 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     IslamicTimelineResponse content = islamicList.get(position); 
     if (content != null) { 

      switch (holder.getItemViewType()) 
      { 
       case ISLAMIC_POST: 
        if (content.postContent.length() > 0 && content.postContent != null) 
         ((IslamicTimelinePostHolder) holder).islamicTimelinePost.setText(content.postID + " : " +content.postContent); 
        break; 

       case ISLAMIC_IMAGE: 
        if (content.postImages.size() > 0 && content.postImages != null) { 
         for (int i = 0; i < content.postImages.size(); i++) 
          Glide.with(context).load(content.postImages.get(i)).into(((IslamicTimelineImageHolder) holder).islamicTimelineImage); 
        } 
        break; 

       case ISLAMIC_VIDEO: 
        if (content.postVideoUrl.length() > 0 && content.postVideoUrl != null) 
         ((IslamicTimelineVideoHolder) holder).islamicTimelineVideo.setVideoURI(Uri.parse(content.postVideoUrl)); 
        break; 

      } 
     } 
    } 


    @Override 
    public int getItemCount() { 
     return (islamicList != null ? islamicList.size() : 0); 
    } 

    public void setContent(List<IslamicTimelineResponse> contents) { 
     this.islamicList.addAll(contents); 
     notifyDataSetChanged(); 
    } 

    private class IslamicTimelinePostHolder extends RecyclerView.ViewHolder { 
     private TextView islamicTimelinePost; 

     private IslamicTimelinePostHolder(View itemView) { 
      super(itemView); 
      islamicTimelinePost = (TextView) itemView.findViewById(R.id.islamic_timeline_post); 
     } 
    } 

    private class IslamicTimelineImageHolder extends RecyclerView.ViewHolder { 

     private ImageView islamicTimelineImage; 

     private IslamicTimelineImageHolder(View itemView) { 
      super(itemView); 
      islamicTimelineImage = (ImageView) itemView.findViewById(R.id.islamic_timeline_image); 
     } 
    } 


    private class IslamicTimelineVideoHolder extends RecyclerView.ViewHolder { 
     private VideoView islamicTimelineVideo; 

     private IslamicTimelineVideoHolder(View itemView) { 
      super(itemView); 
      islamicTimelineVideo = (VideoView) itemView.findViewById(R.id.islamic_timeline_video); 
     } 
    } 


} 

ich viele Beiträge in Stackoverflow zu sehen, aber ich kann mein Problem nicht lösen, erwarte ich, dass mein Problem in dem Adapter ist.

Antwort

0

Sie kehren den Ansichtstyp basierend auf dem Inhalt und jedes Mal, wenn Sie den Inhalt in Ihrem JSON reaponse für den Schlüssel content_text

if (islamicList.get(position).postContent.length() > 0 && islamicList.get(position).postContent != null) 
     return ISLAMIC_POST; 

{EDIT}

Nur um gehen versuchen Um die Bedingung rückgängig zu machen:

+0

Meine Logik ist: Ich suche nach Post-Inhalt, wenn vorhanden Ich möchte Wert zurückgeben, die mir das sagen es gibt einen Post, sonst wenn Bild dasselbe mache aber einen anderen Wert zurückgeben ... und so weiter. Also, meine ich, dass meine Logik falsch ist? Wenn du mir bitte sagst was das optimale Szenario ist ?? –

+0

Aber jedes Mal, wenn deine if-Bedingung wahr ist, weil du Post-Inhalte für jeden Post hast. –

+0

Ummmm, du hast Recht. Aber, sollte ich überprüfen, was zwischen Post, Bild und Video zu unterscheiden? –

Verwandte Themen