ToDoリストアプリを作成しています。テスト中に、何らかの理由で、下にスクロールしようとするたびに項目間に大きなギャップが形成されます。アイテムをドラッグアンドドロップするたびに常に発生しますが、ItemTouchHelperアダプターとコールバッククラスでエラーは表示されません。あなたが私を助けることができれば素晴らしいでしょう。
前:
後:
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が問題を自動的に解決するようです。ダイアログが削除された後、問題が繰り返されます(つまり、スクロールするとアイテム間に大きなスペースが配置されます)
Gabriele Mariottiの回答に対するLuksprogの回答は機能します。
リリース2.3.0では、LayoutManager APIにエキサイティングな新機能が追加されました:auto-measurement!これにより、RecyclerViewはコンテンツのサイズに基づいて自身のサイズを変更できます。 >これは、RecyclerViewのディメンションにWRAP_CONTENTを使用するなど、これまで使用できなかったシナリオが可能になったことを意味します。組み込みのLayoutManagerがすべて自動測定をサポートするようになりました。
この変更により、アイテムビューのレイアウトパラメーターを必ず確認してください:以前は無視されていたレイアウトパラメーター(スクロール方向のMATCH_PARENTなど)は、完全に尊重されます。
アイテムのレイアウトで変更する必要があります:
Android:layout_height="match_parent"
と
Android:layout_height="wrap_content"
リサイクルビューの変更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"
/>
これは私に何度も起こりました!
必要なことは...行ファイルwrap_contentのlayout_heightを作成し、問題を解決するだけです。
Android:layout_height="wrap_content"
ハッピーコーディング!
その理由は、縦向きのlistview/recyclerviewの行項目のルートビューの高さでmatch_parentを使用しているためです。これを使用すると、アイテムは親に完全に展開されます。 wrap_contentを使用して、recyclerviewが垂直向きの場合は高さ、の場合は幅水平指向です。
記録のためだけに:私の場合、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"
/>
paddingTop
and paddingBottom
は機能しましたが、いくつかのGapViews(空のビュー、paddingTopとpaddingBottomの高さ)に置き換えました
コンテンツをラップするために、recyclerviewを保持するViewgroupを設定してみてください。
次のようなコンテナを使用して、アイテムレイアウトでビューを取得しないでください。
<?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
。これで問題は解決するはずです。透明性を高めるには、背景色を指定して、実際の問題を特定するために背景色を確認してください。
私はこの問題を抱えており、ただユーザー
Android:layout_height="wrap_content"
すべてのアイテムの親に対して。
誰かが使用している場合| recyclerViewObject.setHasFixedSize(true);
それを削除してみてください、それは私の場合に問題を引き起こしていました。