RecyclerView?を使用する可能な方法があるかどうかを知りたい
この前に、ScrollView内でfixed heightを指定してRecyclerViewを使用しましたが、今回はアイテムの高さがわかりません。
ヒント:この質問をする前に、スタックの質問に関するすべての質問と解決策を読みました。
更新:いくつかのソリューションはスクロールする方法を示していますRecyclerView単独で、それを展開して表示したいです。
世界中でこの質問の答えを探していますが、この人気のある質問に対する直接的な答えは見つかりませんでした。やっといくつかのトリックを混ぜて、この問題を解決しました!
上司からRecyclerViewをScrollView、そしてご存じのように、2つのScrollableオブジェクトを使用することはできません。ただし、fix item heightRecyclerView。これが答えです:
ステップ1:まず、RecyclerViewフレキシブルアイテムの高さを見つける必要があります。これは、RecyclerView> onBindViewHolder
holder.itemView.post(new Runnable() {
@Override
public void run() {
int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically
dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
}
});
このコードを使用すると、interfaceを使用してアイテムの高さを構築し、アクティビティに送信するときにアイテムの高さがわかります。
インターフェースに問題がある友人のために、アダプターに書くべきインターフェースコードを以下に残します。
public interface DynamicHeight {
void HeightChange (int position, int height);
}
ステップ2:これまでにアイテムの高さを見つけたので、RecyclerViewに高さを設定します。まず、アイテムの高さの合計を計算する必要があります。このステップでは、BitMapfirstimplementslast stepinterfaceおよび以下のコードをActivityまたはフラグメントRecyclerViewを定義する:
@Override
public void HeightChange(int position, int height) {
itemHeight.put(position, height);
sumHeight = SumHashItem (itemHeight);
float density = activity.getResources().getDisplayMetrics().density;
float viewHeight = sumHeight * density;
review_recyclerView.getLayoutParams().height = (int) sumHeight;
int i = review_recyclerView.getLayoutParams().height;
}
int SumHashItem (HashMap<Integer, Integer> hashMap) {
int sum = 0;
for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) {
sum += myItem.getValue();
}
return sum;
}
ステップ3:これで、RecyclerViewの高さの合計ができました。最後の手順では、次のようなコードを使用して、最後の手順で記述したインターフェイスをアダプタに送信するだけです。
reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);
あなたがimplementインターフェースを使用する場合、私が使用するあなたのコンテキストであなたにそれを送るべきですthis。
楽しめ
単にスクロールしたい場合は、ScrollViewの代わりにNestedScrollViewを使用できます。以下を使用してコードを変更します。
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
//design your content here with RecyclerView
</LinearLayout>
</Android.support.v4.widget.NestedScrollView>
あなたのrecyclerviewにこの行を使用してください:
Android:nestedScrollingEnabled="false"
それを試して、recyclerviewは柔軟な高さでスムーズにスクロールされます
[解決済み]Horizontal recycleviewでも同じ問題があります。 recycleviewのGradleリポジトリを変更する
_ compile 'com.Android.support:recyclerview-v7:23.2.1'
_
これを書いてください:linearLayoutManager.setAutoMeasureEnabled(true);
更新中のさまざまなmeasure-specメソッドに関連するバグを修正
チェック http://developer.Android.com/intl/es/tools/support-library/features.html#v7-recyclerview
23.2.1ライブラリで問題を発見しました:アイテムがmatch_parentリサイクルビューで表示するアイテム全体を埋める場合は、常に_min height or "wrap_content".
_を使用してください
ありがとう
RecyclerView
のフリングを修正するには、canScrollVertically
のLinearLayoutManager
をオーバーライドする必要があります。
linearLayoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
return false;
}
};
私はアシュカンのソリューションに完全に同意します、大きな感謝(投票+1!)ですが、一つだけあります...
RecyclerViewがScrollView/NestedScrollView内で正しくスクロールする場合、それが飛び回らない(インターセプトする)場合、ソリューションはRecyclerViewを拡張し、OnInterceptTouchEventとOnTouchEventをオーバーライドすることです。クリックアクションは必要ないが、機能するフリングを備えたアイテムを表示するだけの場合は、次のように両方でfalseを返すだけです。
public class InterceptingRecyclerView extends RecyclerView {
public InterceptingRecyclerView(Context context) {
super(context);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent e) {
return false;
}
}
または、実際にはNonInterceptingと呼ばれるべきです...;)そのように単純です。
(私のような)RecyclerViewの固定高さの設定が機能しない場合、固定高さソリューションに追加したものを次に示します。
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
私
NestedScrollView
の代わりにScrollView
を使用してこの問題を解決しました。 RecyclerView
の場合
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
そしてコード
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);