RecyclerView条目不充满宽度

15

我已经设计了一个包含地图碎片和RecyclerView的布局。 每个RecyclerView项都是cardview(我已经在xml布局中指定)。

问题是RecyclerView项没有填满屏幕宽度。 这里有图片

我尝试将layout_width更改为fill_parentmatch_parent等,但是没有帮助。

以下是每个项的布局:

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

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    android:id="@+id/cardView">

    <LinearLayout
        android:id="@+id/locationItemView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="120px"
            android:layout_height="120px"
            android:id="@+id/imgIcon"
            android:background="@drawable/image_bg"
            android:layout_margin="5dp"
            android:scaleType="fitCenter"
            android:adjustViewBounds="true" />

        <LinearLayout
            android:id="@+id/layoutInfo"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/txtName"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Location Name"
                android:textColor="#d5c645"
                android:textStyle="bold"
                android:textSize="20dp"
                android:padding="3dp" />

            <TextView
                android:id="@+id/txtAddress"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Location Address"
                android:textSize="16dp"
                android:padding="3dp" />

            <TextView
                android:id="@+id/txtDistance"
                android:layout_width="match_parent"
                android:layout_height="fill_parent"
                android:text="Location Distance"
                android:textSize="14dp"
                android:textStyle="italic"
                android:padding="2dp"
                android:textAlignment="viewEnd" />
        </LinearLayout>
    </LinearLayout>
</android.support.v7.widget.CardView>

以及 main_layout

<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:map="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
        android:layout_height="0px" android:id="@+id/map" tools:context=".Main"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_weight=".6"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/locationList"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight=".4"
        android:divider="#FEFFCC"
        android:dividerHeight="1dp" />

</LinearLayout>

<ListView
    android:id="@+id/navdrawer"
    android:layout_width="250px"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="?attr/colorPrimaryDark"
    android:choiceMode="singleChoice"
    android:divider="@android:color/white"
    android:dividerHeight="1dp"
    android:drawSelectorOnTop="false"/>
</android.support.v4.widget.DrawerLayout>

希望有人能帮助我。我已经陷入了这个问题三天了。谢谢。

==================================== 2019年11月15日编辑 我不认为问题出在我的itemView布局上,因为当我将其更改为GridLayout时,它仍然无法填充宽度。 以下是我的RecyclerView的CustomAdapter

public class LocationDetailsAdapter extends RecyclerView.Adapter<LocationDetailsViewHolder> {
    Context _context;
    ArrayList<LocationDetails> _data;

    public LocationDetailsAdapter(Context _context, ArrayList<LocationDetails> _object) {
        this._context = _context;
        _data = _object;
    }

    @Override
    public LocationDetailsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View _v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_location,null );
        LocationDetailsViewHolder _viewHolder = new LocationDetailsViewHolder(_v);

        return _viewHolder;
    }

    @Override
    public void onBindViewHolder(LocationDetailsViewHolder locationDetailsViewHolder, int i) {
        LocationDetails _location = _data.get(i);
        locationDetailsViewHolder._imgType.setImageResource(R.drawable.repair_img);
        locationDetailsViewHolder._locationName.setText(_location.get_locationName());
        locationDetailsViewHolder._locationAddress.setText(_location.get_locationAddress() + ", " + _location.get_district() + ", " + _location.get_province());
        locationDetailsViewHolder._distance.setText(String.valueOf(_location.get_distance()) + " km");

        locationDetailsViewHolder._locationName.setOnClickListener(clickListener);
        locationDetailsViewHolder._imgType.setOnClickListener(clickListener);
        locationDetailsViewHolder._locationAddress.setOnClickListener(clickListener);

locationDetailsViewHolder._locationName.setTag(locationDetailsViewHolder);
        locationDetailsViewHolder._imgType.setTag(locationDetailsViewHolder);
        locationDetailsViewHolder._locationAddress.setTag(locationDetailsViewHolder);
}

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

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LocationDetailsViewHolder _holder = (LocationDetailsViewHolder)v.getTag();
            int _pos = _holder.getPosition();

            int _id = _data.get(_pos).get_id();

            Intent _intent = new Intent(CommonFields._context, ItemView.class);
            _intent.putExtra("LocationID",_id);
            _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            CommonFields._context.startActivity(_intent);
        }
    };
}

这里我在主函数中获取了RecyclerView。

_locationView = (RecyclerView)findViewById(R.id.locationList);
_locationView.setLayoutManager(new LinearLayoutManager(this));
_adapter = new LocationDetailsAdapter(Main.this, CommonFields._locationData);
_locationView.setAdapter(_adapter);

1
展示你的Java代码。特别是在创建ViewHolder时,你填充itemView布局的地方。 - RussHWolf
请展示一张截图,展示您的项目长什么样子? - Arslan Ashraf
1
请查看这个链接: https://dev59.com/zWAf5IYBdhLWcg3wlDYD - Haresh Chhelana
你可以使用match_parent代替fill_parent吗? - Droidekas
@Arslan,我无法在此帖子中附加图像,因此我有一个链接,您可以在顶部看到“img here”。 - thien.vpt
显示剩余2条评论
4个回答

62
当从LayoutInflater填充View时,您需要传递一个父参数,以便使用layout_*属性。这是因为这些属性需要创建正确的LayoutParams类。这意味着您不能使用inflate(R.layout.*, null),而必须传递一个ViewGroup作为第二个参数。在大多数情况下,您还需要使用该方法的三个参数版本,并将false作为第三个参数传递。如果省略此参数或将其设置为true,则View将立即添加到父级,这会在像onCreateViewHolder()这样的位置引起问题,因为框架旨在稍后执行此操作。有关更多详细信息,请参见this answer
在您的情况下,您有以下一行代码:
 View _v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_location,null );

你应该将其改为

 View _v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_location, viewGroup, false );

谢谢你的帮助和解释。它起作用了。似乎有很多东西我需要学习。 - thien.vpt
1
哇,你真是救了我一命!我已经为这个小错误苦苦挣扎了一个星期了。 - Ishaan
完美的解决方案和解释,为我节省了大量时间...谢谢老兄! - Simon Ninon

4
您应该像这样创建 View
@Override
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {  
// create a new view
   View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.card_view, viewGroup, false);
// create ViewHolder
   ViewHolder viewHolder = new ViewHolder(itemLayoutView);
   return viewHolder;
 }

我只是为RecyclerView创建了自定义适配器,而不是为CardView创建。我刚刚编辑了我的帖子。 - thien.vpt

0
也许我的答案有不同的方法,但它可以占据整个屏幕的宽度,并且在通过回收视图时不会破坏元素。
Adapter adapterBalanceInquiry = new Adapter(getActivity(), list);
        recyclerView.setHasFixedSize(true);
        recyclerView.setNestedScrollingEnabled(false);
        recyclerView.setAdapter(adapterBalanceInquiry);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), RecyclerView.HORIZONTAL, false));
        recyclerView.post(new Runnable() {
            @Override
            public void run() {
                try {
                    int dx = (recyclerView.getWidth() - recyclerView.getChildAt(0).getWidth());
                    recyclerView.scrollBy(-dx, 0);
                    LinearSnapHelper snapHelper = new LinearSnapHelper();
                    recyclerView.setOnFlingListener(null);
                    snapHelper.attachToRecyclerView(recyclerView);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });

enter image description here


0
改进的答案 @RussHWolf 如果您在适配器中使用数据绑定,则
val binding = ViewBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )

return MyViewHolder(binding)

终于
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
        MyViewHolder{
        val binding = ViewBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        return MyViewHolder(binding)
    }

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