首页 > 解决方案 > Constraintlayout 的表现不如 recyclerview 的项目

问题描述

我有一个 recyclerview,其项目如下所示:

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_food_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="2dp"
    android:layout_marginBottom="4dp"
    app:cardCornerRadius="4dp">

    <LinearLayout
        android:id="@+id/linear_food_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="start"
        android:orientation="horizontal"
        android:padding="4dp">

        <com.mikhaellopez.circleview.CircleView
            android:id="@+id/food_image"
            android:layout_width="80dp"
            android:layout_height="80dp"
            app:cv_color="@color/colorAccent" />

        <LinearLayout
            android:id="@+id/food_contents"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/food_title_homepage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:fontFamily="@font/sans_regular"
                android:text="عنوان غذا"
                android:textAppearance="@style/TextAppearance.AppCompat.Title" />

            <TextView
                android:id="@+id/ingredients_homepage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:fontFamily="@font/sans_regular"
                android:text="مواد اولیه"
                android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" />

        </LinearLayout>

    </LinearLayout>

</androidx.cardview.widget.CardView>

我正在尝试使用 Constraintlayout 将其转换为平面层次结构。这是它的外观:

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_food_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="2dp"
    android:layout_marginBottom="4dp"
    app:cardCornerRadius="4dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/linear_food_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/food_title_homepage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_marginTop="8dp"
            android:text="عنوان غذا"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            app:layout_constraintStart_toEndOf="@+id/food_image"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ingredients_homepage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:text="مواد اولیه"
            android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
            app:layout_constraintStart_toEndOf="@+id/food_image"
            app:layout_constraintTop_toBottomOf="@+id/food_title_homepage" />

        <com.mikhaellopez.circleview.CircleView
            android:id="@+id/food_image"
            android:layout_width="0dp"
            android:layout_height="80dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            app:cv_color="@color/colorAccent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

这是我的 Recyclerview 插入的位置:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".main.homepage.HomepageFragment">

    <ProgressBar
        android:id="@+id/homepage_progressbar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recipes"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/homepage_toolbar"
        tools:listitem="@layout/fragment_homepage_food_item" />

    <include
        android:id="@+id/homepage_toolbar"
        layout="@layout/fragment_homepage_toolbar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

以下是每个项目的样子:https ://i.stack.imgur.com/AcfAm.png

但我在 Recyclerview 中没有得到相同的结果:https ://i.stack.imgur.com/jpUG4.png

在将视图转换为 Constraintlayout 之前我没有遇到问题!在我转换它们之前,一切都运行良好。他们都在 Recyclerview 中左对齐!!

有谁知道是什么问题??提前致谢

--更新--

它在 android 模拟器或任何其他设备上的样子:https ://i.stack.imgur.com/tvGz4.png

当我向下滚动到底部时(我在每次滚动后更新列表)一些项目变得右对齐(它们以某种方式得到修复)但其余的保持不变(仍然左对齐)

-- Java 代码--

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
viewModel = new ViewModelProvider(this).get(HomepageViewModel.class);

getData(0);

setRecyclerView(linearLayoutManager);

EndlessRecyclerViewScrollListener scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
    @Override
    public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
        getData(page);
    }
};
recyclerView.addOnScrollListener(scrollListener);
private void getData(int offset) {
    viewModel.init(this, offset);
    viewModel.getFoodsLiveData().observe(getViewLifecycleOwner(), foodList -> {
        if (foodList != null) {
            foods.addAll(foodList);
            foodList.clear();
            foodAdapter.notifyDataSetChanged();
        }
    });
}

private void setRecyclerView(LinearLayoutManager linearLayoutManager) {
    foodAdapter = new FoodAdapter(foods);
    recyclerView.setAdapter(foodAdapter);
    recyclerView.setLayoutManager(linearLayoutManager);
}

我的适配器:

private void getData(int offset) {
    viewModel.init(this, offset);
    viewModel.getFoodsLiveData().observe(getViewLifecycleOwner(), foodList -> {
        if (foodList != null) {
            foods.addAll(foodList);
            foodList.clear();
            foodAdapter.notifyDataSetChanged();
        }
    });
}

private void setRecyclerView(LinearLayoutManager linearLayoutManager) {
    foodAdapter = new FoodAdapter(foods);
    recyclerView.setAdapter(foodAdapter);
    recyclerView.setLayoutManager(linearLayoutManager);
}
My adapter:

private List<Food> foods;

    FoodAdapter(List<Food> foods) {
        this.foods = foods;
    }

    static class FoodViewHolder extends RecyclerView.ViewHolder {
        CircleView foodImage;
        TextView foodTitle, ingredients;
        CardView foodItem;

        FoodViewHolder(View itemView) {
            super(itemView);
            foodImage = itemView.findViewById(R.id.food_image);
            foodTitle = itemView.findViewById(R.id.food_title_homepage);
            ingredients = itemView.findViewById(R.id.ingredients_homepage);
            foodItem = itemView.findViewById(R.id.card_food_item);
        }
    }

    @NonNull
    @Override
    public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_homepage_food_item, parent, false);
        return new FoodViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull FoodViewHolder holder, int position) {
        final Food currentFood = foods.get(position);
        
        
        StringBuilder food_ingredient_str = new StringBuilder();
        int ingredient_position = 0;
        int ingredients_size = currentFood.getFood_ingredients().size();
        for (Food.FoodIngredient foodIngredient : currentFood.getFood_ingredients()) {
            food_ingredient_str.append(foodIngredient.getIngredient());
            if (ingredient_position != ingredients_size / 3)
                food_ingredient_str.append(", ");
            if (ingredient_position == ingredients_size / 3) {
                food_ingredient_str.append(" و ...");
                break;
            }
            ingredient_position += 1;
        }

        holder.foodTitle.setText(currentFood.getName());
        holder.ingredients.setText(food_ingredient_str);

        holder.foodItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle bundle = new Bundle();
                bundle.putSerializable("current_food", currentFood);
                Navigation.findNavController(v).navigate(R.id.action_navigation_home_to_navigation_food, bundle);
            }
        });
    }

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

标签: androidandroid-layoutandroid-recyclerview

解决方案


如果您想使用 recyclerview 创建一个列表,并且每个项目都像阿拉伯语一样右对齐..然后尝试这些方法

用这个替换你的“recycle_view_item_layout.xml”

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_food_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="4dp"
app:cardCornerRadius="4dp">

<LinearLayout
    android:id="@+id/linear_food_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="4dp">

    <LinearLayout
        android:id="@+id/food_contents"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/food_title_homepage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:ellipsize="start"
            android:fontFamily="@font/sans_regular"
            android:singleLine="true"
            android:text="عنوان غذا"
            android:textAppearance="@style/TextAppearance.AppCompat.Title" />

        <TextView
            android:id="@+id/ingredients_homepage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:ellipsize="start"
            android:fontFamily="@font/sans_regular"
            android:singleLine="true"
            android:text="مواد اولیه"
            android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" />

    </LinearLayout>

    <com.mikhaellopez.circleview.CircleView
        android:id="@+id/food_image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        app:cv_color="@color/colorAccent" />
</LinearLayout>

</androidx.cardview.widget.CardView>

用这个替换你的“回收视图”

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recipes"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/homepage_toolbar"
        tools:listitem="@layout/fragment_homepage_food_item" />

并附上这样的布局管理器(重要)

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);

setRecyclerView(layoutManager);

你的其余代码似乎还可以


推荐阅读