如何解决荣耀6x中的问题不可见使用StaggeredGridLayoutManager的Recyclerview
我正在使用 Recyclerview ,其图层为 StaggeredGridLayoutManager 。问题在于,大多数电话中都会显示这些项目,但是在 Honor 6x电话中,这些项目不会显示,但是可以单击它们。
我将项目rotationY:180设置为从右到左显示。
我什至使用了 GridLayoutManager ,但它仍然存在相同的问题。
在Honor 6x手机上
Recyclerview窗口小部件
public class AutoFitGridRecyclerView extends RecyclerView {
private StaggeredGridLayoutManager manager;
private int columnWidth = -1;
public AutoFitGridRecyclerView(Context context) {
super(context);
init(context,null);
}
public AutoFitGridRecyclerView(Context context,AttributeSet attrs) {
super(context,attrs);
init(context,attrs);
}
public AutoFitGridRecyclerView(Context context,AttributeSet attrs,int defStyle) {
super(context,attrs,defStyle);
init(context,attrs);
}
private void init(Context context,AttributeSet attrs) {
if (attrs != null) {
// list the attributes we want to fetch
// columnWidth is what GridView uses,so we use it too
int[] attrsArray = {
android.R.attr.columnWidth
};
TypedArray array = context.obtainStyledAttributes(attrs,attrsArray);
//retrieve the value of the 0 index,which is columnWidth
columnWidth = array.getDimensionPixelSize(0,-1);
array.recycle();
}
manager = new StaggeredGridLayoutManager(AppController.NumberColumnAutoFitForRecyclerViewForGridList(120),1);
setLayoutManager(manager);
}
@Override
protected void onMeasure(int widthSpec,int heightSpec) {
super.onMeasure(widthSpec,heightSpec);
if (columnWidth > 0) {
//The spanCount will always be at least 1
int spanCount = Math.max(1,getMeasuredWidth() / columnWidth);
manager.setSpanCount(spanCount);
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
}
在活动布局中
<com.mrsanad.Application.Widgets.AutoFitGridRecyclerView
android:id="@+id/gridMenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:rotationY="180" />
项目布局中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/brow"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_marginTop="5dp"
android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:rotationY="180">
<com.balysv.materialripple.MaterialRippleLayout xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
app:mrl_rippleAlpha="0.2"
app:mrl_rippleColor="@color/colorPrimary"
app:mrl_rippleduration="350"
app:mrl_rippleOverlay="true"
app:mrl_rippleRoundedCorners="100dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/layoutTitle">
<ImageView
android:id="@+id/imgIcon"
android:layout_width="65dp"
android:layout_height="65dp"
android:layout_centerInParent="true"
android:padding="12dp" />
<com.mrsanad.Application.Widgets.BadgeTextView
android:id="@+id/tvCount"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_centerInParent="true"
android:gravity="center"
android:padding="0.5dp"
android:textColor="@color/White"
android:textSize="@dimen/SmallTextSize" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layoutTitle"
android:layout_width="match_parent"
android:layout_height="39dp"
android:layout_alignParentBottom="true">
<com.mrsanad.Application.Widgets.PersianTextViewBold
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:gravity="center"
android:maxLines="2"
android:textColor="@color/Gray"
android:textSize="@dimen/SmallTextSize" />
</RelativeLayout>
</RelativeLayout>
</com.balysv.materialripple.MaterialRippleLayout>
</LinearLayout>
在适配器Java中
package Adapters.ActMain;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.mrsanad.Application.Utility.Variable;
import com.mrsanad.Network.Models.Response.Home.GetHome.Menu;
import com.mrsanad.R;
import com.mrsanad.Application.Utility.AppController;
import com.mrsanad.Application.Widgets.BadgeTextView;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class AdpMenu extends RecyclerView.Adapter<AdpMenu.ViewMenu> {
private List<Menu> Items = new ArrayList<>();
public AdpMenu() {
}
public void AddItems(List<Menu> items) {
Items.addAll(items);
notifyDataSetChanged();
}
public Menu GetItem(int pos) {
return Items.get(pos);
}
@NonNull
@Override
public ViewMenu onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(AppController.Context)
.inflate(R.layout.item_home_menu,parent,false);
return new ViewMenu(view);
}
@Override
public void onBindViewHolder(@NonNull ViewMenu holder,int position) {
Menu item = GetItem(position);
holder.tvTitle.setText(item.NameFa);
AppController.SetPicUrl(holder.imgIcon,item.ImagePath,"");
holder.tvCount.setVisibility(View.GONE);
}
@Override
public int getItemCount() {
return Items.size();
}
public void Clear() {
Items.clear();
notifyDataSetChanged();
}
public class ViewMenu extends RecyclerView.ViewHolder {
@BindView(R.id.imgIcon)
ImageView imgIcon;
@BindView(R.id.tvTitle)
TextView tvTitle;
@BindView(R.id.layoutTitle)
RelativeLayout layoutTitle;
@BindView(R.id.tvCount)
BadgeTextView tvCount;
public ViewMenu(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
tvCount.setstrokeWidth(1);
tvCount.setstrokeColor(AppController.Context.getString(R.color.White));
tvCount.setSolidColor(AppController.Context.getString(R.color.Orange));
}
}
}
在Java Actvity中
@BindView(R.id.gridMenu)
RecyclerView gridMenu;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_main);
AdpMenu AdpMenu = new AdpMenu();
gridMenu.setAdapter(AdpMenu);
AdpMenu.AddItems(\\All items list);
}
解决方法
您应该切换到ConstraintLayout
。
ConstraintLayout允许您使用 平面视图层次结构(无嵌套视图组)。类似于 RelativeLayout,因为所有视图均根据 同级视图和父级布局之间的关系,但这是 比RelativeLayout更加灵活,并且更易于在Android中使用 Studio的布局编辑器。
您可以使用SDP
代替 dp 。此尺寸单位随屏幕尺寸缩放。它可以帮助Android开发人员支持多个屏幕。
dependencies {
implementation 'com.intuit.sdp:sdp-android:1.0.6'
}
您的价值将是
android:layout_width="@dimen/_100sdp"
android:layout_height="@dimen/_100sdp"
android:layout_marginTop="@dimen/_5sdp"
仅供参考
您可以使用Glide
。这是凹凸科技开发的Android图像加载程序库,也是Google推荐的库。
Glide是一种快速有效的开源媒体管理和映像 Android的加载框架,用于包装媒体解码,内存和 磁盘缓存和资源池化成一个简单易用的 界面。
RequestManager requestManager = Glide.with(contextObj);
RequestBuilder requestBuilder = requestManager.load(item.ImagePath);
requestBuilder.into(holder.imgIcon);
成绩
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
,
我假设您正在从drawable加载图像资源。在这种情况下,您应该检查Honor 6x当前正在运行哪个版本?并检查正在加载的资源是否也位于适当的屏幕密度大小文件夹中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。