web-dev-qa-db-ja.com

ScrollView内でRecyclerViewを使用し、Recyclerアイテムの高さを柔軟に設定します

RecyclerView?を使用する可能な方法があるかどうかを知りたい

この前に、ScrollView内でfixed heightを指定してRecyclerViewを使用しましたが、今回はアイテムの高さがわかりません。

ヒント:この質問をする前に、スタックの質問に関するすべての質問と解決策を読みました。

更新:いくつかのソリューションはスクロールする方法を示していますRecyclerView単独で、それを展開して表示したいです。

17
Ashkan

世界中でこの質問の答えを探していますが、この人気のある質問に対する直接的な答えは見つかりませんでした。やっといくつかのトリックを混ぜて、この問題を解決しました!

上司からRecyclerViewScrollView、そしてご存じのように、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

楽しめ

11
Ashkan

単にスクロールしたい場合は、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>
14
Bhunnu Baba

あなたのrecyclerviewにこの行を使用してください:

 Android:nestedScrollingEnabled="false"

それを試して、recyclerviewは柔軟な高さでスムーズにスクロールされます

8
iDeveloper

[解決済み]Horizo​​ntal 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"._を使用してください

ありがとう

7
Amit

RecyclerViewのフリングを修正するには、canScrollVerticallyLinearLayoutManagerをオーバーライドする必要があります。

linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};
6
Michał Ciołek

私はアシュカンのソリューションに完全に同意します、大きな感謝(投票+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と呼ばれるべきです...;)そのように単純です。

2
Darek Deoniziak

(私のような)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) {

    }
});

2
John smith

NestedScrollViewの代わりにScrollViewを使用してこの問題を解決しました。 RecyclerViewの場合

    <Android.support.v7.widget.RecyclerView 
Android:layout_width="match_parent"
  Android:layout_height="match_parent" />

そしてコード

recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
1
Arun PK