RecyclerView适配器仅显示第一项

时间:2017-11-23 12:28:39

标签: android android-recyclerview

我知道这个问题已被多次询问过,但答案对我不起作用。我正在尝试使用水平放置。这是我的代码:

public class CalendarDaysAdapter extends RecyclerView.Adapter<CalendarDaysAdapter.MyViewHolder> {

    private ArrayList<String> list;

    public CalendarDaysAdapter(ArrayList<String> list)
    {
        this.list = list;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_calendar_days_item, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        String day = list.get(position);
        holder.daystxt.setText(day);
    }

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


    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView daystxt;

        public MyViewHolder(View view) {
            super(view);
            daystxt = (TextView) view.findViewById(R.id.daystxt);
        }
    }

}

fragment_calendar_days_item xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center">

        <TextView
            android:id="@+id/daystxt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="MON"
            android:textSize="20sp"/>

    </RelativeLayout>


</LinearLayout>

我尝试了wrap_content - match_parent的每个组合,也在父Activity的RecyclerView xml上,但只显示了第一个项目。我使用了断点来查看列表中的数据是否存在,并且它们是。

那么我错过了什么?

3 个答案:

答案 0 :(得分:7)

将您的 fragment_calendar_days_item 身高和宽度更改为 android:layout_height="wrap_content" android:layout_width="wrap_content"

它将解决您的问题

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center">

        <TextView
            android:id="@+id/daystxt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="MON"
            android:textSize="20sp"/>

    </RelativeLayout>


</LinearLayout>

答案 1 :(得分:2)

试试这个

fragment_calendar_days_item xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center">

        <TextView
            android:id="@+id/daystxt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="MON"
            android:textSize="20sp"/>
    </RelativeLayout>
</LinearLayout>

答案 2 :(得分:1)

我认为您要做的是显示“n”元素,其余元素必须可滚动。

设置硬值的解决方案并不是最好的。它不是通用的。我认为我的解决方案在任何情况下都非常适合。 ; - )

为此,我建议你一个解决方案

首先确定并创建一个MAX_ITEMS变量

科特林

recycler.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
    if (recycler.layoutManager.itemCount > maxItemVisible) {
        val height = (0 until maxItemVisible).sumBy { recycler.layoutManager.findViewByPosition(it).height }
        recycler.layoutParams = LayoutParams(recycler.width, height)
    }
}

的Java

mRecycler.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        if (mRecycler.getLayoutManager().getItemCount() > maxItemVisible) {
            int height = 0;
            for (int i = 0; i < maxItemVisible; i++){
                height += mRecycler.getLayoutManager().findViewByPosition(i).getHeight()
            }
            mRecycler.setLayoutParams(new LinearLayout.LayoutParams(mRecycler.getWidth(), height));
        }
    }
});

希望能满足您的需求