RecyclerView适配器仅显示第一个项目

6
我知道这个问题已经被问了很多次,但是答案对我没有用。我正在尝试使用水平定位。这是我的代码:
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的每种组合,在RecyclerView父Activity的xml中也尝试了,但只有第一项显示。我使用断点查看列表数据是否存在,结果确实存在。

那么我错过了什么?


3
检查一下是否可以在滚动后看到其他项目。 - Manohar
展示创建列表项时的适配器设置代码。 - Pavan
在ArrayList上添加指针并检查列表的大小。你的代码看起来很好,只需要调试和检查一下。 - Ramchandra Singh
3个回答

17

将您的 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
谢谢你的回答。因为我使用了水平布局,所以它是layout_width="wrap_content"。请更改它,这样我就可以接受你的答案了。 - stavros.3p

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>

1
我认为您想要做的是展示“n”个元素,其余部分必须可滚动。
设置硬编码值的解决方案不是最好的,也不够通用。我认为我的解决方案可以很好地适用于任何情况。;-)
为此,我建议您先确定并创建一个MAX_ITEMS变量。

Kotlin

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));
        }
    }
});

希望已经回答了您的需求。

那么,如果使用情况是多个,则很可能创建一个名为Utils的类或Extension Kotlin来避免重复代码。 - Maxime Jallu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接