gpt4 book ai didi

android - 所选项目上的 RecyclerView 错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:31:16 25 4
gpt4 key购买 nike

我已经实现了一个带有 RecyclerView 数据的 Horizo​​ntalScrollView,问题是在我的 Adapter 代码上,我已经实现了一个逻辑当一个项目被点击时它会缩放。问题显然出在这个 video ,我不知道发生了什么 - 我用一个带有 booleanint 的类测试了所有内容,说这个项目被点击然后在 onBindViewHolder 询问这个项目,如果它被点击,然后再次缩放,如果没有然后缩放。

我知道这很令人困惑,但视频有助于解释。

我的 list_row.xml 是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
>

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/RLimage"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
>

<ImageView
android:layout_centerInParent="true"
android:id="@+id/thumbnail"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_launcher"
/>

</RelativeLayout>
<RelativeLayout
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/RLimage"
>
<TextView
android:layout_marginTop="14dp"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#222"
android:textSize="12sp"/>
</RelativeLayout>


</RelativeLayout>

我有这个 RecyclerView 的 fragment 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="1">

<android.support.v7.widget.RecyclerView
android:id="@+id/rcyList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-20dp"
android:paddingLeft="8dp"
android:paddingRight="8dp" />

</FrameLayout>

这是我的 Fragment 中的 onCreateView()

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
this.mContext = getActivity();
View rootView = inflater.inflate(R.layout.fragment_carta, container, false);
rv = (RecyclerView) rootView.findViewById(R.id.rcyList);
CustomLinearLayoutManager layoutManager = new CustomLinearLayoutManager(mContext);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
rv.setLayoutManager(layoutManager);
// Adding code here
dataModelList = new ArrayList<dataModel>();
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
dataModelList.add(new dataModel(ContextCompat.getDrawable(mContext, R.mipmap.ic_launcher),"1234"));
adapter = new MyRecyclerViewAdapter(mContext, dataModelList);
rv.setAdapter(adapter);

return rootView;

}

适配器是这样的:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {

private Context mContext;
View animatedView = null;
private List<dataModel> dataModelList;
int animatedIndex = -1; // Initially no view is clicked so -1
//private PopulateListView populateListview;


public MyRecyclerViewAdapter(Context context, List<dataModel> items) {
this.dataModelList = items;
this.mContext = context;
//this.populateListview = populateListview;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
//View per each row
final View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
CustomViewHolder viewHolder = new CustomViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if (animatedView == null) {
animatedView = view;
} else {
animatedView.setAnimation(null);
animatedView = view;
}
ScaleAnimation fade_in = new ScaleAnimation(1f, 1.2f, 1f, 1.2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(200); // animation duration in milliseconds
fade_in.setFillAfter(true); // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
view.startAnimation(fade_in);
}
});
return viewHolder;
}


@Override
public void onBindViewHolder(final CustomViewHolder customViewHolder, final int i) {
//Setting text view title and drawable
dataModel dataModel = dataModelList.get(i);
customViewHolder.imageView.setImageDrawable(dataModel.icon);
customViewHolder.textView.setText(dataModel.title);

if(animatedIndex == i){
ScaleAnimation fade_in = new ScaleAnimation(1f, 1.2f, 1f, 1.2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(200); // animation duration in milliseconds
fade_in.setFillAfter(true); // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
customViewHolder.itemView.startAnimation(fade_in);
}

customViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animatedIndex = i;
if (animatedView == null) {
animatedView = customViewHolder.itemView;
} else {
animatedView.setAnimation(null);
animatedView = customViewHolder.itemView;
}
//populateListview.PopulateListView(String.valueOf(i));
ScaleAnimation fade_in = new ScaleAnimation(1f, 1.2f, 1f, 1.2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(200); // animation duration in milliseconds
fade_in.setFillAfter(true); // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
customViewHolder.itemView.startAnimation(fade_in);
}
});
}

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

public class CustomViewHolder extends RecyclerView.ViewHolder {
protected ImageView imageView;
protected TextView textView;

public CustomViewHolder(View view) {
super(view);
this.imageView = (ImageView) view.findViewById(R.id.thumbnail);
this.textView = (TextView) view.findViewById(R.id.title);
}
}

注意:我也在使用 this class如果滚动不在 RecyclerView

上,则避免滚动

长话短说

主要问题是,使用这段代码我可以缩放一个项目但是当我滚动(向左或向右)时,这个项目有时会失去缩放,我不知道为什么.视频中显示的错误是我猜想的严重错误...

最佳答案

发生这种情况是因为根据定义,您的 RecyclerView 正在回收其 View 。当 View 弹出 RecyclerView 的边界时,它会被废弃,然后与不同的数据模型绑定(bind)。发生这种情况时, View 的转换数据(平移、缩放、旋转)将被重置。

要解决此问题,您需要添加一些指示以指示 View 已缩放到数据模型(例如 isSelected)。

在您的 onBindViewHolder 方法中,如果选择了 View ,则需要检查数据模型,如果是,则将 View 的比例设置为 1.2,否则设置为 1.0。请注意,在这里您需要设置比例,而不是设置比例动画,因为我们假设当用户触摸 View 时动画已经发生。当我们在 View 上绑定(bind)数据时,我们只是试图将 View 的状态重新创建为上次绑定(bind)时的状态。

在您的 onCreateViewHolder 方法中,您将在展开 View 上设置 onClickListener。在这个新的 onClick 方法中,您应该根据之前的值将新的“isSelected”字段设置为 true/false。

在您的 onBindViewHolder 方法中,您应该删除添加新的 onClickListener 的代码(因为这是多余的)。在这里您应该检查 dataModel.isSelected 值并相应地设置 scaleX/scaleY。

请记住,RecyclerView 中的 View 应被视为原始模板,并由您在 onBindViewHolder 方法中绑定(bind)它们的数据驱动。您不能依赖它们中已经存在的东西(例如它们的动画值等)。

关于android - 所选项目上的 RecyclerView 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com