Articles of android viewholder

即使RecyclerView.findViewHolderForAdapterPosition()在该位置返回null,也不会在视图位置调用onBindViewHolder()

我有一个包含13个项目的列表(虽然可以添加或删除项目),位置0-12。 当首次显示包含RecyclerView的片段时,用户只能看到位置0到7(位置7只有一半可见)。 在我的适配器中,每次视图持有者绑定/绑定时都会记录(如果语法适用于此处为idk)并记录其位置。 适配器 @Override public void onBindViewHolder(final ViewHolder holder, final int position) { Log.d(TAG, “onBindViewHolder() position: ” + position); … } 从我的Log我看到0-7的位置是绑定的: 我有一个selectAll()方法,通过适配器位置获取每个ViewHolder 。 如果返回的holder不是null我使用返回的holder来更新视图以显示它被选中。 如果返回的持有者为null我调用selectOnBind()方法,该方法在该位置更新标记视图,以显示它在绑定时被选中而不是实时,因为它当前未显示: public void selectAll() { for (int i = 0; i < numberOfItemsInList; i++) { MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i); Log.d(TAG, "holder at position " + i + " […]

Android:滚动后RecyclerView内容搞砸了

我正在使用RecyclerView显示标记列表,并且值的每个标记都显示为CardView。 但是,在向下滚动RecyclerView并向后滚动之后,卡片的某些内容会丢失,如下面的两个屏幕截图所示。 滚动后,红色矩形中的内容将丢失。 在滚动之前; 在滚动之后; 我想知道它是否是RecyclerView的一个错误,并在Googling之后找不到解决方案。 除标题外,所有观点都是看不见的,它们的可见性取决于标记的价值。 有谁知道为什么会这样?

RecyclerView.ViewHolder总是必须是一个内部类吗?

我有两个RecyclerView.Adapter使用完全相同的RecyclerView.ViewHolder作为内部类。 我想摆脱代码重复,并使这些ViewHolder免费,单独的类,所以现在全新的类可以用于任何RecyclerView.Adapter s。 但是,我遇到了很多麻烦,例如访问适配器对象的困难。 getAdapterPosition()总是返回-1 。 所以我改变了主意,做了一个由这些适配器扩展的超级RecyclerView.Adapter类,并将ViewHolder放在超类中,以便这些适配器可以从子类中使用它。 但是我想知道ViewHolder是否必须是内部类。 这让我很烦恼。 请不要指教我结合适配器类,他们是完全不同的ViewHolder只是一个特殊的viewType可以出现在任何RecyclerView 我正在等待你的更好的方法,让我感觉更好。 问候。

如何在RecyclerView.Adapter中从ViewHolder调用MainActivity方法?

在GitHub的一个简单的应用程序项目中,我只有两个自定义的Java文件: MainActivity.java包含蓝牙和UI相关的源代码 DeviceListAdapter.java包含一个Adapter和ViewHolder用于在RecyclerView显示蓝牙设备 MainActivity.java包含一个方法,当用户在RecyclerView的蓝牙设备上点击时: public void confirmConnection(String address) { final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to pair to " + device + "?"); builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { device.createBond(); } }); builder.setNegativeButton(R.string.button_cancel, null); builder.show(); } 在ViewHolder类中(在DeviceListAdapter.java中 ),定义了点击侦听器: public class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.ViewHolder> […]

应该持有人参考适配器?

我正在阅读来自Google的示例代码,代码是这样的: public class AttractionListFragment extends Fragment { … private class AttractionAdapter extends RecyclerView.Adapter<ViewHolder> implements ItemClickListener { public List<Attraction> mAttractionList; private Context mContext; public AttractionAdapter(Context context, List<Attraction> attractions) { super(); mContext = context; mAttractionList = attractions; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d("TEST", "onCreateViewHolder"); LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(R.layout.list_row, parent, […]

什么导致这个exceptionjava.lang.RuntimeException:java.lang.NoSuchMethodException:<init>

我的firebase项目出现问题 我遵循firebase GitHub文档上的步骤,但是我得到了这个exception java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View] 这是一个不是内部类的ViewHolder类。 public class ProductViewHolder extends RecyclerView.ViewHolder{ public View mView; public ImageView img; public TextView title; public TextView price; public RatingBar stars; ProductViewHolder(View itemView) { super(itemView); mView = itemView; img = (ImageView) itemView.findViewById(R.id.productImg); title = (TextView) itemView.findViewById(R.id.txtTitle); price = (TextView) itemView.findViewById(R.id.txtPrice); stars = (RatingBar) itemView.findViewById(R.id.ratingBar); } } 这是与Firebase相关的代码 […]

在ViewHolder中绑定

这将是理论上的问题。 就像我们每个人在应用程序的许多部分使用RecyclerView一样。 有时RecyclerView包含不同的项目,不仅仅是图像,而是广告,提示等。这就是为什么我们可以在Adapter中使用getViewType()方法。 但是,当我们有很多viewTypes和绑定在适配器不是优雅的问题发生。 所以这里是一个问题, 在ViewHolder中绑定数据是否好又好? 比方说,我们有应用程序的列表。 每个应用程序都有简单的名字。 我们的ViewHolder如下所示: class AppViewHolder extends RecyclerView.ViewHolder { public TextView nameText; AppViewHolder(View itemView) { super(itemView) nameText = (TextView) itemView.findViewById(R.id.text_name); } } 现在我们可以添加绑定方法: public void bind(App app) { nameText.setText(app.getName()); } 这是不错的模式? 另一种解决scheme是使用ViewModel。 因为我们在RecyclerView中有不同的项目,所以我们的Adapter可以包含每个ViewModel基类的类的列表。 所以基础课是: class RecyclerViewItem {} 现在是ViewModel for App的类。 class AppRecyclerViewItem extends RecyclerViewItem { App app; … } 和我们的适配器只是有RecyclerViewItems列表: […]

RecyclerView的行是洗牌和改变图像:android

问题的变化与其他问题一样。 我的问题是当回收站视图滚动向上和向下 当快速滚动并返回到原始位置时,行项目会更改它的位置。 行项目使得它的一部分修复为背景 这里我如何设置我的Recycler视图在片段。 private void setRecyclerView() { recyclerView.setHasFixedSize(true); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, 1); recyclerView.setLayoutManager(layoutManager); adapter = new TwitterTweetAdapter(getActivity()); // setting every thing false in item animator recyclerView.setItemAnimator(new RecyclerView.ItemAnimator() { @Override public void runPendingAnimations() { } @Override public boolean animateRemove(RecyclerView.ViewHolder viewHolder) { return false; } @Override public boolean animateAdd(RecyclerView.ViewHolder viewHolder) { return false; […]

如何处理RecyclerView.ItemDecoration中的点击事件?

我有一个RecyclerView(LinearLayoutManager)和一个自定义的RecyclerView.ItemDecoration它。 比方说,我想在装饰视图中有button(出于某种原因..)。 我用button膨胀布局,它正确绘制。 但是我不能让button点击。 如果我按下它,没有发生(它保持不变,没有按下的效果)和onClick事件不会触发。 ItemDecoration布局的结构是 <LinearLayout> <TextView/> <Button/> </LinearLayout> 我试图在ViewHolder中设置监听器的装饰 class ItemDecorationHolder extends RecyclerView.ViewHolder { public TextView header; public Button button; public HeaderHolder(View itemView) { super(itemView); header = (TextView)itemView.findViewById(R.id.header); button = (Button)itemView.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //.. Show toast, etc. } }); } } 我在onDrawOver方法中绘制装饰。 (实际上,我正在修改这个代码库: https : //github.com/edubarr/header-decor […]

RecyclerView itemView OnGlobalLayoutListener不会触发所有itemViews

我有一个RecyclerView在其视图持有人构造函数我添加一个onGlobalLayoutListener如下 public CustomViewHolder(final View itemView, Context context) { super(itemView, context); itemView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Get height here } }); } 这会触发屏幕上可见的所有itemViews ,但当滚动recyclerView时,它不会触发开始显示在屏幕上的itemViews 。 这是为什么? 我如何捕获这些项目的听众?