1

Я пытаюсь создать ListView, каждая строка которого является горизонтальным списком прокрутки. Раньше я использовал HorizontalScrollView, но мне нужен макет, который мог бы перерабатывать виды. Поэтому я использовал RecyclerView, но теперь содержимое RecyclerView не видно.Содержимое RecyclerView не видно

Вот мой адаптер для вертикального ListView:

public class FeedAdapter extends BaseAdapter { 
    private Context context; 
    private FeedItem feedItem; 
    private static LayoutInflater inflater = null; 
    private Picasso picasso; 
    Typeface opensans; 

    public FeedAdapter(Context context, FeedItem feedItem) { 
     this.context = context; 
     this.feedItem = feedItem; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     opensans = Typeface.createFromAsset(context.getAssets(), "fonts/OpenSans-Regular.ttf"); 
     OkHttpClient okHttpClient = new OkHttpClient(); 
     picasso = new Picasso.Builder(context) 
       .downloader(new OkHttpDownloader(okHttpClient)) 
       .build(); 
    } 


    @Override 
    public int getCount() { 
     return feedItem.getFeedList().size(); 
    } 

    @Override 
    public FeedList getItem(int position) { 
     return feedItem.getFeedList().get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final FeedRowViewHolder rowViewHolder; 

     if (view == null) { 
      view = inflater.inflate(R.layout.feed_row, parent, false); 
      rowViewHolder = new FeedRowViewHolder(view); 
      view.setTag(rowViewHolder); 
     } else { 
      rowViewHolder = (FeedRowViewHolder) view.getTag(); 
     } 

     final FeedList feedList = feedItem.getFeedList().get(position); 

     picasso.with(context) 
       .load(feedList.getThumbnailUrl()) 
       .resize(120, 120) 
       .centerCrop() 
       .into(rowViewHolder.galleryThumb); 
     rowViewHolder.galleryThumb.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String api_url = feedList.getUrl(); 
       String delims = "/"; 
       String[] tokens = api_url.split(delims); 
       String thumbId = tokens[5]; 
       ((HomeActivity) context).changeIntent(thumbId); 
      } 
     }); 

     rowViewHolder.galleryName.setText(feedList.getGalleryName()); 
     rowViewHolder.galleryName.setTypeface(opensans); 
     rowViewHolder.galleryName.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String api_url = feedList.getUrl(); 
       String delims = "/"; 
       String[] tokens = api_url.split(delims); 
       String thumbId = tokens[5]; 
       ((HomeActivity) context).changeIntent(thumbId); 
      } 
     }); 

     rowViewHolder.timestamp.setText(feedList.getCreatedDate()); 
     rowViewHolder.timestamp.setTypeface(opensans); 

     rowViewHolder.followButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       picasso.with(context) 
         .load(R.drawable.cta_button_follow_secondary_state) 
         .into(rowViewHolder.followButton); 
      } 
     }); 

     LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); 
     rowViewHolder.recyclerView.setLayoutManager(layoutManager); 
     FeedItemAdapter adapter = new FeedItemAdapter(context, feedList.getPhotos()); 
     rowViewHolder.recyclerView.setAdapter(adapter); 

     return view; 
    } 

    static class FeedRowViewHolder { 
     @Bind(R.id.imageView75) 
     ImageView galleryThumb; 
     @Bind(R.id.textView65) 
     TextView galleryName; 
     @Bind(R.id.textView66) 
     TextView timestamp; 
     @Bind(R.id.imageView162) 
     ImageView followButton; 
     @Bind(R.id.recyclerView) 
     RecyclerView recyclerView; 

     public FeedRowViewHolder(View view) { 
      ButterKnife.bind(this, view); 
     } 
    } 
} 

Вот мой адаптер для горизонтального RecyclerView:

public class FeedItemAdapter extends RecyclerView.Adapter<FeedItemAdapter.ViewHolder> { 
    private List<Photo> list; 
    private Context context; 
    private Picasso picasso; 
    Typeface opensans; 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_item, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     final Photo photo = getValueAt(position); 

     picasso.with(context) 
       .load(photo.getPhotoUrl()) 
       .resize(1020, 768) 
       .centerCrop() 
       .into(holder.image); 
     holder.image.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String photo_url = photo.getPhoto(); 
       String delims = "/"; 
       String[] tokens = photo_url.split(delims); 
       String photoId = tokens[5]; 
       ((HomeActivity) context).setBackImage(photoId); 
      } 
     }); 

     picasso.with(context) 
       .load(photo.getProfilePic()) 
       .resize(120, 120) 
       .centerCrop() 
       .transform(new CircleTransform()) 
       .into(holder.profilePic); 
     holder.profilePic.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String user_url = photo.getOwner(); 
       String delims = "/"; 
       String[] tokens = user_url.split(delims); 
       String photoId = tokens[5]; 
       ((HomeActivity) context).showUserProfile(photoId); 
      } 
     }); 

     holder.commentButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((HomeActivity) context).showComments(); 
      } 
     }); 

     holder.fiveImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((HomeActivity) context).showLikes(); 
      } 
     }); 

     holder.commentImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((HomeActivity) context).showComments(); 
      } 
     }); 

     holder.username.setText(photo.getUserName()); 
     holder.username.setTypeface(opensans); 

     holder.userFives.setText(Integer.toString(photo.getUserFives()) + " Fives"); 
     holder.userFives.setTypeface(opensans); 

     holder.caption.setText(photo.getCaption()); 
     holder.caption.setTypeface(opensans); 

     final int[] fives = {photo.getPhotoFives()}; 
     holder.numFives.setText(Integer.toString(photo.getPhotoFives())); 
     holder.numFives.setTypeface(opensans); 

     holder.numComments.setText(Integer.toString(photo.getNumComments())); 
     holder.numComments.setTypeface(opensans); 

     final boolean[] liked = {false}; 
     holder.fiveButton.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
        holder.fiveButton.setText("Hi Fiveeed!"); 
        holder.fiveButton.setTypeface(opensans); 
        holder.fiveButton.setTextColor(Color.parseColor("#FAC80A")); 

        picasso.with(context) 
          .load(R.drawable.cta_ic_five_pressed_state) 
          .into(holder.fiveImage); 
       } 
       if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
        holder.fiveButton.setText("Five This!"); 
        holder.fiveButton.setTypeface(opensans); 
        holder.fiveButton.setTextColor(Color.parseColor("#707070")); 

        picasso.with(context) 
          .load(R.drawable.user_profile_activity_1_ic_five_count) 
          .into(holder.fiveImage); 
       } 
       if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) { 
        holder.fiveButton.setText("Five This!"); 
        holder.fiveButton.setTypeface(opensans); 
        holder.fiveButton.setTextColor(Color.parseColor("#707070")); 

        picasso.with(context) 
          .load(R.drawable.user_profile_activity_1_ic_five_count) 
          .into(holder.fiveImage); 
       } 
       return false; 
      } 
     }); 
     holder.fiveButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (liked[0] == false) { 
        holder.fiveButton.setText("Hi Fived!"); 
        holder.fiveButton.setTypeface(opensans); 
        holder.fiveButton.setTextColor(Color.parseColor("#FAC80A")); 

        holder.numFives.setText(Integer.toString(fives[0] + 1)); 
        fives[0] = fives[0] + 1; 

        picasso.with(context) 
          .load(R.drawable.cta_ic_five_pressed_state) 
          .into(holder.fiveImage); 

        liked[0] = true; 
       } else { 
        holder.fiveButton.setText("Five This!"); 
        holder.fiveButton.setTypeface(opensans); 
        holder.fiveButton.setTextColor(Color.parseColor("#707070")); 

        holder.numFives.setText(Integer.toString(fives[0] - 1)); 
        fives[0] = fives[0] - 1; 

        picasso.with(context) 
          .load(R.drawable.user_profile_activity_1_ic_five_count) 
          .into(holder.fiveImage); 

        liked[0] = false; 
       } 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    public Photo getValueAt(int position) { 
     return list.get(position); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     @Bind(R.id.imageView86) 
     ImageView image; 
     @Bind(R.id.imageView76) 
     ImageView profilePic; 
     @Bind(R.id.textView67) 
     TextView username; 
     @Bind(R.id.textView68) 
     TextView userFives; 
     @Bind(R.id.textView1) 
     TextView caption; 
     @Bind(R.id.textView69) 
     TextView fiveButton; 
     @Bind(R.id.textView71) 
     TextView commentButton; 
     @Bind(R.id.imageView77) 
     ImageView fiveImage; 
     @Bind(R.id.textView72) 
     TextView numFives; 
     @Bind(R.id.imageView120) 
     ImageView commentImage; 
     @Bind(R.id.textView73) 
     TextView numComments; 

     public ViewHolder(View view) { 
      super(view); 
      ButterKnife.bind(this, view); 
     } 

    } 

    public FeedItemAdapter(Context context, List<Photo> list) { 
     this.context = context; 
     this.list = list; 
     opensans = Typeface.createFromAsset(context.getAssets(), "fonts/OpenSans-Regular.ttf"); 
     OkHttpClient okHttpClient = new OkHttpClient(); 
     picasso = new Picasso.Builder(context) 
       .downloader(new OkHttpDownloader(okHttpClient)) 
       .build(); 
    } 
} 

Вот мой макет для строки ListView:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroller_placeholder" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#231f20" 
    android:orientation="vertical"> 


    <LinearLayout 
     android:id="@+id/linearLayout7" 
     android:background="#343031" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <ImageView 
       android:id="@+id/imageView75" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerVertical="true" 
       android:paddingRight="5dp" 
       android:src="@drawable/user_profile_activity_1_img_gallery_1_icon" 
       android:layout_marginTop="10dp" 
       android:layout_marginBottom="10dp" 
       android:layout_marginLeft="10dp" /> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerVertical="true" 
       android:layout_toRightOf="@+id/imageView75" 
       android:orientation="vertical" 
       android:paddingLeft="5dp"> 

       <TextView 
        android:id="@+id/textView65" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:alpha="0.8" 
        android:paddingBottom="2dp" 
        android:text="Wilderness" 
        android:textColor="#FFFFFF" /> 

       <TextView 
        android:id="@+id/textView66" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:paddingTop="2dp" 
        android:text="2 hrs." 
        android:textAppearance="?android:attr/textAppearanceSmall" 
        android:textColor="#707070" 
        android:textSize="12sp" /> 
      </LinearLayout> 

      <ImageView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/imageView162" 
       android:src="@drawable/cta_button_follow_default_state" 
       android:layout_alignParentEnd="true" 
       android:layout_marginRight="20dp" 
       android:layout_centerVertical="true" /> 
     </RelativeLayout> 
    </LinearLayout> 

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

</LinearLayout> 

Элементы для каждой строки отображались отлично, когда я использовал HorizontalScrollView, но cont Экземпляры recyclerView не отображаются. Я не могу понять, в чем проблема. Любая помощь будет высоко оценен.

ответ

2

Я думаю, что ваша проблема находится здесь RecyclerViewandroid:layout_height="wrap_content". Постарайтесь установить этот атрибут на определенное значение.

Update

Новый релиз Android Support Library 23.2:

виджет RecyclerView обеспечивает передовую и гибкую основу для создания списков и сетей, а также поддержки анимации. Этот выпуск приносит новую функциональность API LayoutManager: автоматическое измерение! Это позволяет RecyclerView самому размеру на основе размера его содержимого. Это означает, что ранее недоступные сценарии , такие как использование WRAP_CONTENT для измерения RecyclerView, теперь возможны. Вы найдете все встроенные в LayoutManagers теперь поддерживают автоматическое измерение.

+0

Эй, это работает. Но как я могу воздержаться от установки жестко заданного значения высоты и установить его на лету? –

+0

@AmitTiwari, если он работает, вы должны принять мой ответ. –

1

Как сообщается, вам необходимо установить layout-height на определенную сумму. Вы можете получить высоту показанных элементов и передать это параметру layout-height.

https://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html документация для добавления layoutparams на лету.

+0

спасибо. Я буду смотреть в него. –

0

проверить этот метод, чтобы вычислить высоту recyclerview динамически

// calculating height of Recycler view 
private int calculateHeight(int size,int viewHeight) { 
    final float scale = mContext.getResources().getDisplayMetrics().density; 
    int singleViewHeight = (int) (viewHeight * scale + 0.5f); 
    int totalHeight = singleViewHeight * size; 
    return totalHeight; 
} 

и установить высоту recyclerview как-

 //get recyclerview height 
     int height = calculateHeight(firstParam, secondparam); 
     ViewGroup.LayoutParams params = recyclerView.getLayoutParams(); 
     params.height = height; 

firstparam является sizofYourDataList_or_Array и secondparam является высотой вашей строки для recyclerview (у вас есть чтобы дать высоту для макета строки и это будет вашим вторым параметром)

+0

если высота строки является динамической, то какая-то строка содержит только текст. В некоторой строке содержится текст и изображения и т. Д., Тогда – kId

+0

это не вычисляет высоту строки.вычисляет только высоту recyclerview, если строка имеет фиксированную высоту – Sadashiv

Смежные вопросы