phone 和模拟器上的 RecyclerView 项目间距奇怪,但 Android Studio 预览中的间距正常
RecyclerView Item Weird Spacing on phone and Emulator but Normal on Android Studio Preview
我有一个在回收站视图中显示帖子的应用程序。回收商查看项目有一张图片、一个标题和一个带有主题标签的芯片组
我的问题是,当我在我的 phone 或模拟器上播放应用程序时,芯片组和文本之间出现奇怪的间距,但在预览中看起来不错
这可能是什么?
这是回收站的 xml 查看项目:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:gravity="center_horizontal|top"
android:orientation="vertical"
android:padding="10dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:background="@color/white"
android:clipToPadding="false"
android:elevation="4dp"
android:padding="2dp">
<ImageView
android:id="@+id/imageViewThumbnailRecyclerPost"
android:layout_width="157dp"
android:layout_height="100dp"
android:backgroundTint="@color/dark_gray_eg"
android:foregroundGravity="center"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
app:srcCompat="@drawable/thumbnail_preview" />
<ImageView
android:id="@+id/imageViewTypeRecyclerPost"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_margin="3dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="4dp"
android:elevation="3dp"
android:foregroundGravity="center"
android:scaleType="centerInside"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/google_slides_icon" />
<ImageView
android:id="@+id/imageViewStatusRecyclerPost"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_margin="3dp"
android:foregroundGravity="center"
android:scaleType="centerInside"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageViewTypeRecyclerPost"
app:srcCompat="@drawable/icon_edited" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/textViewTitleRecyclerPost"
android:layout_width="157dp"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:lines="2"
android:text="A Vinda da fampilia real e a independencia do Brasil"
android:textColor="@color/dark_gray_eg"
android:textSize="13sp"
android:textStyle="bold" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupRecyclerPost"
android:layout_width="157dp"
android:layout_height="wrap_content"
android:layout_marginStart="-1dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="-1dp"
app:chipSpacingHorizontal="0dp"
app:chipSpacingVertical="5dp"
app:singleLine="false">
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
这是它在预览中的样子,在我的 phone 中应该是这样的:
这就是它在我的 phone 上的实际样子:
这是我初始化回收器的方式:
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 2);
adapterRecyclerSearch = new AdapterRecyclerSearch(getContext(), postsList);
recyclerViewSearch.setLayoutManager(layoutManager);
recyclerViewSearch.setHasFixedSize(true);
recyclerViewSearch.setAdapter(adapterRecyclerSearch);
这是我的适配器:
public class AdapterRecyclerSearch extends RecyclerView.Adapter<AdapterRecyclerSearch.MyViewHolder> {
// list of Posts
public List<DatabasePostHolder> postsList = new ArrayList<>();
public Context context;
public StorageReference storage = FirebaseInstances.getStorageReference();
public StorageReference storageThumbnails = storage.child(Constants.STORAGE_FOLDER_THUMBNAILS);
public AdapterRecyclerSearch(Context context, List<DatabasePostHolder> postsList){
// recieve context for glide and posts list to display
this.context = context;
this.postsList = postsList;
}
public void setPostsList(List<DatabasePostHolder> postsList) {
this.postsList = postsList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View postView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_post_layout, parent, false);
return new MyViewHolder(postView);
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// set hashtag chips
List<String> tagsList = postHolderInPosition.getTags();
holder.chipGroupHashtags.removeAllViews();
for (int i=0; i<tagsList.size(); i++){
Chip chip = (Chip) LayoutInflater.from(context).inflate(R.layout.chip_hashtag_template, holder.chipGroupHashtags, false);
chip.setText("#" + tagsList.get(i));
holder.chipGroupHashtags.addView(chip);
}
}
@Override
public int getItemCount() {
return postsList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
// variables of what will be inside the layout for the adapter
TextView textViewTitle;
ImageView imageThumbnail, imageType, imageStatus;
ChipGroup chipGroupHashtags;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
// define view components from post layouts
textViewTitle = itemView.findViewById(R.id.textViewTitleRecyclerPost);
imageThumbnail = itemView.findViewById(R.id.imageViewThumbnailRecyclerPost);
imageType = itemView.findViewById(R.id.imageViewTypeRecyclerPost);
imageStatus = itemView.findViewById(R.id.imageViewStatusRecyclerPost);
chipGroupHashtags = itemView.findViewById(R.id.chipGroupRecyclerPost);
}
}
}
将这个添加到芯片组出现资源为我解决了这个问题
<item name="chipMinTouchTargetSize">0dp</item>
<item name="chipMinHeight">15dp</item>
我有一个在回收站视图中显示帖子的应用程序。回收商查看项目有一张图片、一个标题和一个带有主题标签的芯片组
我的问题是,当我在我的 phone 或模拟器上播放应用程序时,芯片组和文本之间出现奇怪的间距,但在预览中看起来不错
这可能是什么?
这是回收站的 xml 查看项目:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:gravity="center_horizontal|top"
android:orientation="vertical"
android:padding="10dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:background="@color/white"
android:clipToPadding="false"
android:elevation="4dp"
android:padding="2dp">
<ImageView
android:id="@+id/imageViewThumbnailRecyclerPost"
android:layout_width="157dp"
android:layout_height="100dp"
android:backgroundTint="@color/dark_gray_eg"
android:foregroundGravity="center"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
app:srcCompat="@drawable/thumbnail_preview" />
<ImageView
android:id="@+id/imageViewTypeRecyclerPost"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_margin="3dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="4dp"
android:elevation="3dp"
android:foregroundGravity="center"
android:scaleType="centerInside"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/google_slides_icon" />
<ImageView
android:id="@+id/imageViewStatusRecyclerPost"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_margin="3dp"
android:foregroundGravity="center"
android:scaleType="centerInside"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageViewTypeRecyclerPost"
app:srcCompat="@drawable/icon_edited" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/textViewTitleRecyclerPost"
android:layout_width="157dp"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:lines="2"
android:text="A Vinda da fampilia real e a independencia do Brasil"
android:textColor="@color/dark_gray_eg"
android:textSize="13sp"
android:textStyle="bold" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupRecyclerPost"
android:layout_width="157dp"
android:layout_height="wrap_content"
android:layout_marginStart="-1dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="-1dp"
app:chipSpacingHorizontal="0dp"
app:chipSpacingVertical="5dp"
app:singleLine="false">
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
这是它在预览中的样子,在我的 phone 中应该是这样的:
这就是它在我的 phone 上的实际样子:
这是我初始化回收器的方式:
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 2);
adapterRecyclerSearch = new AdapterRecyclerSearch(getContext(), postsList);
recyclerViewSearch.setLayoutManager(layoutManager);
recyclerViewSearch.setHasFixedSize(true);
recyclerViewSearch.setAdapter(adapterRecyclerSearch);
这是我的适配器:
public class AdapterRecyclerSearch extends RecyclerView.Adapter<AdapterRecyclerSearch.MyViewHolder> {
// list of Posts
public List<DatabasePostHolder> postsList = new ArrayList<>();
public Context context;
public StorageReference storage = FirebaseInstances.getStorageReference();
public StorageReference storageThumbnails = storage.child(Constants.STORAGE_FOLDER_THUMBNAILS);
public AdapterRecyclerSearch(Context context, List<DatabasePostHolder> postsList){
// recieve context for glide and posts list to display
this.context = context;
this.postsList = postsList;
}
public void setPostsList(List<DatabasePostHolder> postsList) {
this.postsList = postsList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View postView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_post_layout, parent, false);
return new MyViewHolder(postView);
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// set hashtag chips
List<String> tagsList = postHolderInPosition.getTags();
holder.chipGroupHashtags.removeAllViews();
for (int i=0; i<tagsList.size(); i++){
Chip chip = (Chip) LayoutInflater.from(context).inflate(R.layout.chip_hashtag_template, holder.chipGroupHashtags, false);
chip.setText("#" + tagsList.get(i));
holder.chipGroupHashtags.addView(chip);
}
}
@Override
public int getItemCount() {
return postsList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
// variables of what will be inside the layout for the adapter
TextView textViewTitle;
ImageView imageThumbnail, imageType, imageStatus;
ChipGroup chipGroupHashtags;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
// define view components from post layouts
textViewTitle = itemView.findViewById(R.id.textViewTitleRecyclerPost);
imageThumbnail = itemView.findViewById(R.id.imageViewThumbnailRecyclerPost);
imageType = itemView.findViewById(R.id.imageViewTypeRecyclerPost);
imageStatus = itemView.findViewById(R.id.imageViewStatusRecyclerPost);
chipGroupHashtags = itemView.findViewById(R.id.chipGroupRecyclerPost);
}
}
}
将这个添加到芯片组出现资源为我解决了这个问题
<item name="chipMinTouchTargetSize">0dp</item>
<item name="chipMinHeight">15dp</item>