当前位置: 首页 > 知识库问答 >
问题:

如何在一个特定的回收器视图项目(cardView)动画视图?

杨安歌
2023-03-14

新手在这里。当长时间按下卡片(列表项)时,我很难在单个列表项上实现动画。当我长按一张卡片时,所有卡片都会动画化。有人可以解释为什么只有当回收器View的水平滚动被我禁用时才会发生此问题。

主要活动:

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
TextView score;
ArrayList words = new ArrayList();
wordCardsList wc;
static int scored = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);
    final int initialDatasetSize = words.size();

    score = findViewById(R.id.score);
    score.setText("" + 0 + "/" + initialDatasetSize);
    recyclerView = findViewById(R.id.recyclerView);

    wc = new wordCardsList(this, words);
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false){
        @Override
        public boolean canScrollHorizontally() {
            return false;
        }
    };

    final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false);

    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(wc);


    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.UP) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            mediaPlayer.start();
            vibrator.vibrate(6);
            if(words.size()!=1) {
                int pos = viewHolder.getAdapterPosition();
                words.remove(pos);

                System.out.println(words.size());
                wc.notifyDataSetChanged();
            }

            score.setText("" + ++scored + "/" + initialDatasetSize);

        }
    }).attachToRecyclerView(recyclerView);
}
}

回收器视图适配器:

public class wordCardsList extends RecyclerView.Adapter<wordCardsList.PersonViewHolder>{

private ArrayList words;
private Context context;
Converter converter = new Converter();
int longPressCount = 0;


public wordCardsList(Context context, ArrayList words) {

    this.words = words;
    this.context = context;

}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.card, parent, false);
    final PersonViewHolder personViewHolder = new PersonViewHolder(view);
    longPressCount = 1;

    return personViewHolder;
}


@Override
public void onBindViewHolder(wordCardsList.PersonViewHolder holder, int position) {
    final String word = words.get(position).toString();
    holder.words.setText(word);
    holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            //Working: System.out.println("Long Pressed on" + personViewHolder.getAdapterPosition());
            if(longPressCount == 1) {
                float pixels = converter.convertDpToPixel(190f, context);

                view.findViewById(R.id.cardLayout).animate().translationY(-pixels).setDuration(100).start();
                view.findViewById(R.id.exampleHeading).animate().alpha(1f).setDuration(400).start();
                view.findViewById(R.id.example1).animate().alpha(1f).setDuration(400).start();
                view.findViewById(R.id.example2).animate().alpha(1f).setDuration(400).start();
                view.findViewById(R.id.definitionHeading).animate().alpha(1f).setDuration(400).start();
                view.findViewById(R.id.definition1).animate().alpha(1f).setDuration(400).start();
                vibrator.vibrate(6);
                scored--;
                longPressCount=0;
            }

            return true;
        }
    });

}

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


class PersonViewHolder extends RecyclerView.ViewHolder{

    public TextView words;
    public CardView cardView;

    public PersonViewHolder(View view) {

        super(view);
        words = view.findViewById(R.id.wordName);
        cardView = view.findViewById(R.id.card);

    }

}
}

共有1个答案

鱼恩
2023-03-14

您不想在java程序中执行的操作只是在您的XML卡中进行一些更改,如下所示

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

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="@dimen/size_5"
        android:elevation="3dp"
        card_view:cardCornerRadius="@dimen/size_5">

        <LinearLayout
            android:id="@+id/list_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/size_20"
            android:layout_marginRight="@dimen/size_20"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:orientation="vertical"
            android:paddingBottom="@dimen/font_10"
            android:paddingTop="@dimen/font_10">

        </LinearLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

主要的变化是在你的LinearLayout中添加这一行,仅此而已

android:background=“attr/selectableitemsbackgroundless”

 类似资料:
  • 我正在使用RecyclerView,并有一些动画,我可以在ViewHolder项目中放大一个相对布局。 注意:它不是添加/删除/插入动画。当用户在 ViewHolder 项中交互时,它将启动。因此,我在这里没有使用ItemAnimator。 动画工作正常,但它会在某个随机视图项中重新出现(最终状态)。我知道这是由于物品的重复使用,我也在清除动画,但这没有帮助。 我在节目里做这个 在onViewDe

  • 我正面临一个奇怪的错误,其中recyclerview只显示了一个项目。下面是我的recyclerview适配器的代码: 我已经在其他应用程序中使用了这段代码,它的工作非常完美。我已经检查了聊天数据,这也是完美的。 这里是指向git repo布局文件的链接:布局文件

  • 然后,在每个@test方法中,我调用activitytestrule.launchactivity(Intent.action_main)),然后进行单击。我发现,只有第一次点击不起作用,但第二次和第三次点击起作用。那么,这种行为的原因又能是什么呢?

  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 这是我的适配器 我想每次滚动一个项目。比如你在Instagram上看到多张照片。我怎么能那样做? 谢谢 和我的XML;

  • 我在机器人中有一个回收站视图。我已向其附加了。我只启用了从左向右滑动。 因此,当我在Recycle视图中滑动任何项目时,该项目开始向右移动,在左侧我绘制一个文本。这很好。我的要求是,我只允许用户滑动一定距离,当达到该距离并且用户释放触摸时,被滑动的项目应该回到其向左的位置。 问题是,当我从左向右滑动时,视图会被完全从屏幕上刷掉。我如何才能将其限制为仅在一定距离内滑动?我该怎么做? 以下是我的物品触