Articles of android viewholder

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 。 这是为什么? 我如何捕获这些项目的听众?

ViewHolder – 良好的做​​法

一个小新手的问题。 为什么要在getView()初始化ViewHolder ? 为什么我们不能在构造函数中初始化它?

RecyclerView.Adapter的onCreateViewHolder被多次调用两次或多次

我目前正在开发一个使用RecyclerView的应用程序。 在审查LogCat时,我注意到onCreateViewHolder在实例化后被调用了两次。 09-22 05:22:55.209 V/Adapter﹕ Construct 09-22 05:22:55.213 V/Adapter﹕ onCreateViewHolder 09-22 05:22:55.224 V/Adapter﹕ onBindViewHolder 09-22 05:22:55.240 V/Adapter﹕ onCreateViewHolder 09-22 05:22:55.247 V/Adapter﹕ onBindViewHolder 另外onBindViewHolder被调用了两次,但我知道它被称为每当项目被回收。 但我认为onCreateViewHolder是足够的被调用一次。 这是不正常的行为? 如果是这样,那该如何解决?