Android:RecyclerViewにビューを追加するときの奇妙な反応

ジョン・イワシ

私はフッターとヘッダーを持つことができるカスタムrecyclerViewを使用していますが、これはアニメーションに影響を与えるべきではありません。これが起こっていることのビデオです:http://www.videosprout.com/video?id = 00fae6ac-39ff-47b6 -b981-803d2773b67b

すべてのビューが、それを行わないのではなく、ある位置に戻ってから元の位置に戻るのはなぜですか?

これが私のアダプターです:

public class AddEventsAdapter extends HFRecyclerViewAdapter<String, AddEventsAdapter.ViewHolder> {

    public AddEventsAdapter(Context context) {
        super(context);
    }

    @Override
    public void footerOnVisibleItem() {

    }

    @Override
    public void addData(int position, String item) {
        super.addData(position, item);
    }

    @Override
    public ViewHolder onCreateDataItemViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.event_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindDataItemViewHolder(ViewHolder holder, int position) {
        holder.itemTv.setText(getData().get(position));
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        TextView itemTv;
        public ViewHolder(View itemView) {
            super(itemView);
            itemTv = (TextView)itemView.findViewById(R.id.eventName);

        }
    }
}

実装:

    final AddEventsAdapter MyAdapter = new AddEventsAdapter(this);
    AddEventsRecycler.setAdapter(MyAdapter);
    AddEventsRecycler.setLayoutManager(new LinearLayoutManager(this));

    //add footer
    final View footerView = LayoutInflater.from(this).inflate(R.layout.events_footer, AddEventsRecycler, false);
    MyAdapter.setFooterView(footerView);

    footerView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MyAdapter.addData(0, "Event number" + ++g);
        }
    });

    ArrayList<String> data = new ArrayList<>();
    data.add("Vacation");

    MyAdapter.setData(data);

カスタムRecyclerAdapter:

public abstract class HFRecyclerViewAdapter<T, VH extends RecyclerView.ViewHolder> extends BaseRecyclerViewAdapter<T> {

    public HFRecyclerViewAdapter(Context context) {
        super(context);
    }

    private static final int TYPE_HEADER = Integer.MAX_VALUE;
    private static final int TYPE_FOOTER = Integer.MAX_VALUE - 1;
    private static final int ITEM_MAX_TYPE = Integer.MAX_VALUE - 2;
    private RecyclerView.ViewHolder headerViewHolder;
    private RecyclerView.ViewHolder footerViewHolder;

    class HFViewHolder extends RecyclerView.ViewHolder {
        HFViewHolder(View v) {
            super(v);
        }
    }

    public void setHeaderView(View header){
        if (headerViewHolder == null || header != headerViewHolder.itemView) {
            headerViewHolder = new HFViewHolder(header);
            notifyDataSetChanged();
        }
    }

    public void setFooterView(View foot){
        if (footerViewHolder == null || foot != footerViewHolder.itemView) {
            footerViewHolder = new HFViewHolder(foot);
            notifyDataSetChanged();
        }
    }

    public void removeHeader(){
        if (headerViewHolder != null){
            headerViewHolder = null;
            notifyDataSetChanged();
        }
    }
    public void removeFooter(){
        if (footerViewHolder != null){
            footerViewHolder = null;
            notifyDataSetChanged();
        }
    }

    public boolean isHeader(int position){
        return hasHeader() && position == 0;
    }

    public boolean isFooter(int position){
        return hasFooter() && position == getDataItemCount() + (hasHeader() ? 1 : 0);
    }

    private int itemPositionInData(int rvPosition){
        return rvPosition - (hasHeader() ? 1 : 0);
    }
    private int itemPositionInRV(int dataPosition){
        return dataPosition + (hasHeader() ? 1 : 0);
    }

    @Override
    public void notifyMyItemInserted(int itemPosition) {
        notifyItemInserted(itemPositionInRV(itemPosition));
    }
    @Override
    public void notifyMyItemRemoved(int itemPosition) {
        notifyItemRemoved(itemPositionInRV(itemPosition));
    }

    @Override
    public void notifyMyItemChanged(int itemPosition) {
        notifyItemChanged(itemPositionInRV(itemPosition));
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            return headerViewHolder;
        } else if (viewType == TYPE_FOOTER) {
            return footerViewHolder;
        }
        return onCreateDataItemViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (!isHeader(position) && !isFooter(position))
            onBindDataItemViewHolder((VH)holder, itemPositionInData(position));

        if (isFooter(position)){
            footerOnVisibleItem();
        }
    }

    public abstract void footerOnVisibleItem();

    @Override
    public int getItemCount() {
        int itemCount = getDataItemCount();
        if (hasHeader()) {
            itemCount += 1;
        }
        if (hasFooter()) {
            itemCount += 1;
        }
        return itemCount;
    }

    @Override
    public int getItemViewType(int position) {
        if (isHeader(position)) {
            return TYPE_HEADER;
        }
        if (isFooter(position)) {
            return TYPE_FOOTER;
        }
        int dataItemType = getDataItemType(itemPositionInData(position));
        if (dataItemType > ITEM_MAX_TYPE) {
            throw new IllegalStateException("getDataItemType() must be less than " + ITEM_MAX_TYPE + ".");
        }
        return dataItemType;
    }

    public int getDataItemCount() {
        return super.getItemCount();
    }

    /**
     * make sure your dataItemType < Integer.MAX_VALUE-1
     *
     * @param position item view position in rv
     * @return item viewType
     */
    public int getDataItemType(int position){
        return 0;
    }


    public boolean hasHeader(){
        return headerViewHolder != null;
    }
    public boolean hasFooter(){
        return footerViewHolder != null;
    }

    public abstract VH onCreateDataItemViewHolder(ViewGroup parent, int viewType);

    public abstract void onBindDataItemViewHolder(VH holder, int position);



}

編集:ビューを削除するときに同じことが起こっています、removeData(getAdapterPosition()

エリック

なぜ

これは、要素が配列の先頭(インデックス0)に追加されているために発生しています。これが発生RecyclerViewすると、バッキングデータストアがリストであると偽って、すべての要素が1つのインデックス上に移動され、要素が最初に挿入されるため、ビデオに示されているように反応します...トップ。

アダプターの最後に要素が追加されている場合、この醜い動作は行われないことがわかりますMyAdapter.addData(MyAdapter.getItemCount() - 1, "Event ");しかしもちろん、これもあなたが望むものではありません。なぜなら、それは間違ったインデックスだからです...そして今、既存の要素が実際にGUIなどで1つのインデックスをジャンプしているように見えます...しかしこれは興味深い実験です理論を検証します。

解決策

を使用して配列の最後に要素を追加しますMyAdapter.addData(MyAdapter.getItemCount() - 1, "Event ");が、LinearLayoutManager表示要素を逆にします。これは次の方法で実行できます。

RecyclerView.Adapterただし、ヘッダーとフッターがアダプターに配置されていることを確認して、ヘッダーとフッターRecyclerView.LayoutManagerが逆に表示されている場合は、ヘッダーとフッターについて何かを行う必要があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ジュリア、辞書を反復処理中にキーを変更するときの奇妙な動作

分類Dev

ナビゲーションの奇妙な戻るボタンとポップ動作に反応する

分類Dev

KotlinのContraintLayoutにプログラムでビューを追加しようとする奇妙な動作

分類Dev

Android:ビューを削除してrecyclerViewに適切に追加する

分類Dev

JavaFX-親にノードを追加するときの奇妙な動作

分類Dev

回転するときに奇妙なことをする反応でキャンバスに描く

分類Dev

ネイティブAndroidのビューが反応ネイティブに表示するために取得することができません。

分類Dev

モデル付きのMVCビューを返すときにjson応答を追加できますか?

分類Dev

日付に日を追加するときの奇妙な動作

分類Dev

JavaScriptで要素を追加するときの奇妙なエラー

分類Dev

反応ネイティブでreduxのレデューサーのカートに既存の製品を追加することはできません

分類Dev

投稿に反応するときに役割を追加する際の問題

分類Dev

codeigniterでビューをロードしているときに奇妙な文字を取得する

分類Dev

android studioは、テキストビューに文字列を追加するときに互換性のないタイプを提供します

分類Dev

2つのビューを制約するときのConstraintLayoutの奇妙な属性の動作

分類Dev

Androidビューの上端と下端に異なる色の境界線を追加する方法

分類Dev

ビューにimageviewを追加するときのAndroidランタイムエラー

分類Dev

反応、タブを動的に生成するときのエラー

分類Dev

2つのビュー間に制約を追加するときに展開するビュー

分類Dev

日付をcurrentDateSwiftと比較したときの奇妙な反応

分類Dev

Android:リストビューのボタンごとにbutton:onclickに異なるリンクを追加します

分類Dev

Android、XAMARIN:ビューがrecyclerviewに表示されているかどうかを確認し、イベントに反応します

分類Dev

Androidビューの上部と下部に境界線を追加する簡単な方法はありますか?

分類Dev

ビューに触れたときの「奇妙な」動作

分類Dev

タイムアウト後にビューを追加すると、他のビューのパディングがうまくいかなくなります-Android

分類Dev

RecyclerViewのビューを現在のアイテムにのみ動的に追加する

分類Dev

値がAndroidビューであるときに複数の値を使用するとKotlinが機能しない

分類Dev

Recyclerviewの下に空のビューを追加できません

分類Dev

NestedScrollViewのRecyclerViewの後にビューを追加できません

Related 関連記事

  1. 1

    ジュリア、辞書を反復処理中にキーを変更するときの奇妙な動作

  2. 2

    ナビゲーションの奇妙な戻るボタンとポップ動作に反応する

  3. 3

    KotlinのContraintLayoutにプログラムでビューを追加しようとする奇妙な動作

  4. 4

    Android:ビューを削除してrecyclerViewに適切に追加する

  5. 5

    JavaFX-親にノードを追加するときの奇妙な動作

  6. 6

    回転するときに奇妙なことをする反応でキャンバスに描く

  7. 7

    ネイティブAndroidのビューが反応ネイティブに表示するために取得することができません。

  8. 8

    モデル付きのMVCビューを返すときにjson応答を追加できますか?

  9. 9

    日付に日を追加するときの奇妙な動作

  10. 10

    JavaScriptで要素を追加するときの奇妙なエラー

  11. 11

    反応ネイティブでreduxのレデューサーのカートに既存の製品を追加することはできません

  12. 12

    投稿に反応するときに役割を追加する際の問題

  13. 13

    codeigniterでビューをロードしているときに奇妙な文字を取得する

  14. 14

    android studioは、テキストビューに文字列を追加するときに互換性のないタイプを提供します

  15. 15

    2つのビューを制約するときのConstraintLayoutの奇妙な属性の動作

  16. 16

    Androidビューの上端と下端に異なる色の境界線を追加する方法

  17. 17

    ビューにimageviewを追加するときのAndroidランタイムエラー

  18. 18

    反応、タブを動的に生成するときのエラー

  19. 19

    2つのビュー間に制約を追加するときに展開するビュー

  20. 20

    日付をcurrentDateSwiftと比較したときの奇妙な反応

  21. 21

    Android:リストビューのボタンごとにbutton:onclickに異なるリンクを追加します

  22. 22

    Android、XAMARIN:ビューがrecyclerviewに表示されているかどうかを確認し、イベントに反応します

  23. 23

    Androidビューの上部と下部に境界線を追加する簡単な方法はありますか?

  24. 24

    ビューに触れたときの「奇妙な」動作

  25. 25

    タイムアウト後にビューを追加すると、他のビューのパディングがうまくいかなくなります-Android

  26. 26

    RecyclerViewのビューを現在のアイテムにのみ動的に追加する

  27. 27

    値がAndroidビューであるときに複数の値を使用するとKotlinが機能しない

  28. 28

    Recyclerviewの下に空のビューを追加できません

  29. 29

    NestedScrollViewのRecyclerViewの後にビューを追加できません

ホットタグ

アーカイブ