web-dev-qa-db-ja.com

下にスクロールすると、RecyclerViewアイテム間に大きなギャップが形成される

ToDoリストアプリを作成しています。テスト中に、何らかの理由で、下にスクロールしようとするたびに項目間に大きなギャップが形成されます。アイテムをドラッグアンドドロップするたびに常に発生しますが、ItemTouchHelperアダプターとコールバッククラスでエラーは表示されません。あなたが私を助けることができれば素晴らしいでしょう。

前: Before

後: After

RecyclerAdapter.Java

public class RecyclerAdapter extends                                                                                                                                 

RecyclerView.Adapter<RecyclerAdapter.RecyclerVH> implements ItemTouchHelperAdapter{
private LayoutInflater layoutInflater;
ArrayList<Info> data;
Context context;

public RecyclerAdapter(Context context) {
    layoutInflater = LayoutInflater.from(context);
    this.context = context;
}

public void setData(ArrayList<Info> data) {
    this.data = data;
    notifyDataSetChanged();
}

@Override
public RecyclerVH onCreateViewHolder(ViewGroup viewGroup, int position) {
    View view = layoutInflater.inflate(R.layout.custom_row, viewGroup, false);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("R.A onClick Owen", "onClick method triggered");
        }
    });
    RecyclerVH recyclerVH = new RecyclerVH(view);
    return recyclerVH;
}

@Override
public void onBindViewHolder(RecyclerVH recyclerVH, int position) {
    Log.d("RecyclerView", "onBindVH called: " + position);

    final Info currentObject = data.get(position);
    // Current Info object retrieved for current RecyclerView item - USED FOR DELETE
    recyclerVH.listTitle.setText(currentObject.title);
    recyclerVH.listContent.setText(currentObject.content);

    /*recyclerVH.listTitle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Open new Activity containing note content
            Toast.makeText(this, "Opening: " + currentObject.title, Toast.LENGTH_LONG).show();
        }
    });*/
}

public void deleteItem(int position) {
    DBInfo dbInfo = new DBInfo(context);
    dbInfo.deleteNote(data.get(position));
    // Deletes RV item/position's Info object

    data.remove(position);
    // Removes Info object at specified position

    notifyItemRemoved(position);
    // Notifies the RV that item has been removed
}


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

// This is where the Swipe and Drag-And-Drog methods come into place
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
    // Swapping positions
    // ATTEMPT TO UNDERSTAND WHAT IS GOING ON HERE
    Collections.swap(data, fromPosition, toPosition);
    notifyItemMoved(fromPosition, toPosition);
    return true;
}

@Override
public void onItemDismiss(int position) {
    // Deleting item from RV and DB
    deleteItem(position);
}

class RecyclerVH extends RecyclerView.ViewHolder implements View.OnClickListener{
    // OnClickListener is implemented here
    // Can also be added at onBindViewHolder above
    TextView listTitle, listContent;

    public RecyclerVH(View itemView) {
        super(itemView);

        listTitle = (TextView) itemView.findViewById(R.id.title);
        listContent = (TextView) itemView.findViewById(R.id.content);

        listTitle.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(context, "Opening: Note" + getLayoutPosition(), Toast.LENGTH_SHORT).show();
        // PS NEVER ADD listTitle VARIABLE AS PUBLIC VARIABLE ABOVE WHICH IS GIVEN VALUE AT ONBINDVH
        // THIS IS BECAUSE THE VALUE WILL CHANGE IF ITEM IS ADDED OR DELETED
    }
}
}

activity_main.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:fab="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity"
Android:orientation="vertical"
Android:weightSum="1">

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/rounded_corners" />

<FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recyclerList"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <RelativeLayout
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

        <com.melnykov.fab.FloatingActionButton
            Android:id="@+id/fab_add"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentEnd="true"
            Android:layout_marginBottom="16dp"
            Android:layout_marginRight="16dp"
            Android:layout_marginEnd="16dp"
            Android:gravity="bottom|end"
            Android:onClick="addNote"
            Android:src="@drawable/fab_ic_add"
            fab:fab_colorNormal="@color/colorPrimary"
            fab:fab_colorPressed="@color/colorPrimaryDark"
            fab:fab_colorRipple="@color/colorPrimaryDark" />
    </RelativeLayout>
</FrameLayout>
</LinearLayout>

custom_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<LinearLayout
    Android:id="@+id/main"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <TextView
        Android:id="@+id/title"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:padding="8dp"
        Android:text="@string/test"
        Android:textSize="18sp"
        Android:textStyle="bold" />
</LinearLayout>
<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/main"
    Android:paddingLeft="8dp">
    <TextView
        Android:id="@+id/content"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/test"
        Android:textSize="15sp" />
</LinearLayout>
</RelativeLayout>

私を助けてくれる人に感謝します。入力中に髪を引っ張ります。

編集:問題はItemTouchHelperクラスではないことを確認しました。 (呼び出されずに実行しようとしましたが、それでも問題が発生します。)また、ダイアログが表示され、キーボードが表示されると、バックグラウンドのRecyclerViewが問題を自動的に解決するようです。ダイアログが削除された後、問題が繰り返されます(つまり、スクロールするとアイテム間に大きなスペースが配置されます)

34

Gabriele Mariottiの回答に対するLuksprogの回答は機能します。

doc

リリース2.3.0では、LayoutManager APIにエキサイティングな新機能が追加されました:auto-measurement!これにより、RecyclerViewはコンテンツのサイズに基づいて自身のサイズを変更できます。 >これは、RecyclerViewのディメンションにWRAP_CONTENTを使用するなど、これまで使用できなかったシナリオが可能になったことを意味します。組み込みのLayoutManagerがすべて自動測定をサポートするようになりました。

この変更により、アイテムビューのレイアウトパラメーターを必ず確認してください:以前は無視されていたレイアウトパラメーター(スクロール方向のMATCH_PARENTなど)は、完全に尊重されます

アイテムのレイアウトで変更する必要があります:

Android:layout_height="match_parent"

Android:layout_height="wrap_content" 
82

リサイクルビューの変更match_parentからwrap_content

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/recyclerView"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>

アイテムレイアウトxmlの変更

親レイアウトの高さを作成match_parent to wrap_content

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <TextView
            Android:id="@+id/textView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
        />
34
mohit

これは私に何度も起こりました!

必要なことは...行ファイルwrap_contentのlayout_heightを作成し、問題を解決するだけです。

Android:layout_height="wrap_content"

ハッピーコーディング!

4
Android Geek

その理由は、縦向きのlistview/recyclerviewの行項目のルートビューの高さでmatch_parentを使用しているためです。これを使用すると、アイテムは親に完全に展開されます。 wrap_contentを使用して、recyclerviewが垂直向きの場合は高さ、の場合は幅水平指向です。

2
saurabhlahoti

記録のためだけに:私の場合、RecyclerViewとぼかし効果のツールバーを重ねて「スーパーファンシーUI」を実装する必要があったため、clipToPadding="false"RecyclerView- xml内。

<Android.support.v7.widget.RecyclerView
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:paddingTop="@dimen/height_toolbar"
  Android:paddingBottom="@dimen/height_bottom_bar_container"
  //Android:clipToPadding="false" <-- remove this flag!
  Android:scrollbars="vertical"
/>

paddingTopand paddingBottomは機能しましたが、いくつかのGapViews(空のビュー、paddingTopとpaddingBottomの高さ)に置き換えました

0
longilong

コンテンツをラップするために、recyclerviewを保持するViewgroupを設定してみてください。

0
amos godwin

次のようなコンテナを使用して、アイテムレイアウトでビューを取得しないでください。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">

<data/>

<Android.support.constraint.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

<TextView
        Android:id="@+id/text"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:minHeight="?android:listPreferredItemHeight"
        Android:textAppearance="?android:attr/textAppearanceMedium" />
</Android.support.constraint.ConstraintLayout>
</layout>

この場合のようにmatch_parentは作業を行いますが、問題は残ります。むしろ次のようにそれを取る:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <data/>

    <TextView
        Android:id="@+id/text"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:minHeight="?android:listPreferredItemHeight"
        Android:textAppearance="?android:attr/textAppearanceMedium" />
</layout>

[注:上記のコードにはデータバインディングが添付されています。<layout><data>データバインディングを使用しない場合のタグ]

これ以外に、ビューグループコンテナを使用する必要がある場合は、コンテナの高さと幅の属性を確認し、match_parentからwrap_content。これで問題は解決するはずです。透明性を高めるには、背景色を指定して、実際の問題を特定するために背景色を確認してください。

0
Ashutosh Tiwari

私はこの問題を抱えており、ただユーザー

Android:layout_height="wrap_content"

すべてのアイテムの親に対して。

0
user2591714

誰かが使用している場合| recyclerViewObject.setHasFixedSize(true);

それを削除してみてください、それは私の場合に問題を引き起こしていました。

0
Shaheryar Malik