我知道如何以编程方式将回收器视图滚动到特定位置。但我的问题是我有一个带有垂直线性布局的回收器视图,它的每一行都有另一个子回收器视图网格布局。现在,当我以编程方式滚动父回收器视图时,它不会滚动到给定位置。但是,如果从中删除子回收器视图,那么它会毫无问题地滚动。这就是我尝试过的方法,并且对于单个回收器视图来说一切正常,行中没有子回收器视图。
card_recyclerView.getLayoutManager().scrollToPosition(position)
card_recyclerView.smoothScrollToPosition(position);
card_recyclerView.getLayoutManager().scrollToPositionWithOffset(position, 20);
Run Code Online (Sandbox Code Playgroud)
我的主要回收者视图
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/card_recyclerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:clipToPadding="false"
android:layout_marginLeft="5dp"
android:background="#ffffff"
android:layout_weight="1"
/>
Run Code Online (Sandbox Code Playgroud)
主要回收者视图行项目
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/cards_recycler_adapter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/layout_see_more_top"/>
Run Code Online (Sandbox Code Playgroud) 我的应用程序上下文,以便您可以理解我的问题:
我目前正在编写一个非常复杂的应用程序,其中包含一个巨大的仪表板,其中包含大量嵌套的 RecyclerView(水平和垂直)。我知道垂直房车内的垂直房车是一种不好的做法,但不幸的是,这里的管理层和客户的要求比我们的建议更强烈,他们真的希望它得到实施。我们是如何获得垂直房车中的垂直房车的?我们的后端基本上提供了需要在仪表板内呈现的组的数组列表。基本上是服务器驱动的用户界面。这些组包含各种不同的设计、垂直子列表、水平子列表等。到目前为止,我已经成功地为这个 DashBoard 适配器构建了一个原型,现在我想更深入地了解性能优化。
我尝试过提高性能的事情:
我已经实现了 DiffUtil 来使仪表板在数据刷新时更有效地更新。我已将适配器设置为使用每个组都有的稳定 ID 和唯一的哈希值。我已经使用constraintLayout创建了平面UI,并且布局可能绝对最少。我已经使用了数据绑定,事实证明它实际上只提高了一点性能,而不仅仅是更好的干净代码。我绝对没有在适配器或 viewHolder 中进行任何数据处理,整个数据流具有来自更高数据层的最终形状。我已
linearLayoutManager.initialPrefetchItemCount = x在每个嵌套 RV 上设置,其中 x 是在任何滚动之前在屏幕上呈现的项目数。
然后我遇到了 RecycledViewPool。我见过一些人们用这个技巧提高列表性能的例子。基本上,他们获取父大适配器的 recyclerViewPool 并将其设置在嵌套的 RV 上。我也实现了这个,我的大问题是现在我所有的嵌套项目都完全混淆了。
而不是像这样拥有三个水平房车:
现在我把它们都混在一起了,如下所示:
这是我的recycledViewPool实现:
class GlobalAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val groups: ArrayList<Group> = ArrayList()
private var recyclerViewPool = RecyclerView.RecycledViewPool()
[...]
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
CATEGORIES_LIST.typeText.hashCode() -> {
val holder = CategoryGroupViewHolder(
DataBindingUtil.inflate(
LayoutInflater.from(parent.context),
R.layout.group_item_categories_list, parent, false
), adapterCallback
)
holder.binding.recyclerView.setRecycledViewPool(recyclerViewPool)
holder
}
[...]
Run Code Online (Sandbox Code Playgroud)
所以我基本上将 viewPool …
android adapter kotlin android-recyclerview nestedrecyclerview
我有一个 recyclerview(parent),在片段中填充了一些 recyclerviews(child),我想使用操作(例如单击操作)直接从片段更新每个嵌套的 recyclerviews(child),我该如何在完美且高效的方式?
初始父适配器
ParentAdapter adapter = new ParentAdapter(dataSet);
mBinding.recyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
父适配器.java
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {
private final RecyclerView.RecycledViewPool viewPool;
private List<CartItemCategory> dataSet;
public MainAdapter(List<CartItemCategory> dataSet) {
this.dataSet = dataSet;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ShoppingCardParentItemLayoutBinding mBinding = ShoppingCardParentItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(mBinding);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mBinding.setCartItemCategory(dataSet.get(position));
ChildAdapter childAdapter = new ChildAdapter(dataSet.get(position).getCartItems());
holder.mBinding.recyclerView.setHasFixedSize(true);
holder.mBinding.recyclerView.setAdapter(childAdapter);
holder.mBinding.recyclerView.setRecycledViewPool(viewPool);
}
@Override
public int getItemCount() {
return dataSet.size();
} …Run Code Online (Sandbox Code Playgroud) 我RecyclerViews在LinearLayout里面有2 个ScrollView:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/few_value">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.foodjoo.fjco.customViews.BYekanFontText
android:id="@+id/market_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:padding="@dimen/normal_plus_value"
android:text=" ?????? > ????? ???? ??? "
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead"
android:textColor="@color/light_black2" />
<android.support.v7.widget.RecyclerView
android:id="@+id/market_cat_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.foodjoo.fjco.customViews.BYekanFontText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:padding="@dimen/normal_plus_value"
android:text="????? ???"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead"
android:textColor="@color/light_black2" />
<android.support.v7.widget.RecyclerView
android:id="@+id/market_hours_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)
两个回收商都有nestedScrollEnabledfla.
问题在于:当渲染布局时,第一个recyclerView将填充,屏幕底部的第二个recyclerView将不会显示所有项目,因为第一个高度!! 但它应该滚动,因为它们都在scrollView !!
所以有什么问题 ?
android android-layout android-recyclerview nestedrecyclerview
这是我的代码:
//主要活动
公共类 MainActivity 扩展 AppCompatActivity {
List<Section> sectionList = new ArrayList<>();
RecyclerView mainRecyclerView;
LinearLayoutManager layoutManager;
MainRecyclerAdapter mainRecyclerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile_properties);
initData();
initRecyclerView();
}
Run Code Online (Sandbox Code Playgroud)
}
//ChildRecyclerAdapter
公共类 ChildRecyclerAdapter 扩展 RecyclerView.Adapter<ChildRecyclerAdapter.ChildViewHolder> {
private final List<String> items;
private OnItemClickListener mListener;
public ChildRecyclerAdapter(List<String> items) {
this.items = items;
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
@NonNull
@Override
public ChildViewHolder onCreateViewHolder(@NonNull …Run Code Online (Sandbox Code Playgroud) android onclicklistener android-recyclerview nestedrecyclerview
我正在尝试制作一个包含多个项目的嵌套回收器视图,在完成适配器和设计并进行测试后,我在模拟器中得到了这个
\n\n\n\n我不明白为什么项目会这样出现,这些项目的高度和宽度与我为其布局设计而设计的高度和宽度不同。
\n\n这是 recyclerview 设置的代码
\n\n mRecyclerView.setHasFixedSize(true);\n adapter = new CheckoutMainRecyAdapter(CheckOutActivity.this, allSampleData);\n mRecyclerView.setLayoutManager(new LinearLayoutManager(CheckOutActivity.this));\n mRecyclerView.setAdapter(adapter);\nRun Code Online (Sandbox Code Playgroud)\n\n这是适配器代码
\n\npublic class CheckoutMainRecyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n private ArrayList<CheckoutMainModel> dataList;\n private Context mContext;\n\npublic CheckoutMainRecyAdapter(Context context, ArrayList<CheckoutMainModel> dataList) {\n this.dataList = dataList;\n this.mContext = context;\n\n}\n\n@Override\npublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {\n View view;\n switch (i) {\n case Constants.type_checkout_address:\n view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.checkout_address_item, null);\n CheckoutMainRecyAdapter.AddressItemHolder mho = new CheckoutMainRecyAdapter.AddressItemHolder(view);\n return mho;\n case Constants.type_checkout_policy:\n view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.checkout_policy_item, null);\n CheckoutMainRecyAdapter.TermsItemHolder pro = new CheckoutMainRecyAdapter.TermsItemHolder(view);\n …Run Code Online (Sandbox Code Playgroud)