Articles of android viewholder

仅将RecyclerView中的视图动态添加到当前项目

我在RecyclerView动态地将视图添加到我的项目中。 这些添加的视图应该只与它们被添加到的项目相关,但是当我滚动时我遇到了问题。 似乎View被回收并加载了一个新项目,但之前添加的视图仍然存在,现在只有错误的项目。 我假设它只是因为ViewHolder被重用,所以添加的项目在加载时会再次出现一个新项目。 怎么会解决这个问题呢?

RecyclerView – 当视图不再可见时回调

我有一个带有Adapter和LayoutManager的RecyclerView。 适配器有大约15种不同的ViewHolders。 其中一个包含加载外部内容的WebView(其中99%是YouTube以外的video)。 当任何适配器视图离开屏幕时出现问题 – WebView中的video继续播放并且声音正在播放。 不过,这对我来说是可以接受的。 当我转移到另一个Activity时,关键问题就开始了。 video的声音仍然存在。 当任何子视图改变可见性状态(意味着从显示中消失)时,RecyclerView是否有任何方式可以通知我?

如何从RecyclerView.Adapter 打开片段

1.TabLayout – tab1 (Fragment1) – tab2 (Fragment2) – tab3 (Fragment3) * RecyclerView + CardView (OnClick) 在CardView ClickListner上打开tab3中的另一个片段。 那么如何在tab3中打开片段。 错误在getFragmentManager() : FragmentTransaction transaction = getFragmentManager().beginTransaction(); 而不是这个,我试过: FragmentTransaction transaction = activity.getFragmentManager().beginTransaction(); FragmentTransaction transaction = itemview.getContext().getFragmentManager().beginTransaction(); 但错误并未解决。 这是我的代码: public class CardAdapter extends RecyclerView.Adapter { List mItems; private int lastPosition = -1; Context context; TaskFragment main; public CardAdapter(Context context,TaskFragment […]

为什么在ViewHolder模式中ViewHolder类应该是静态的?

我只是想更好地理解我经常用来优化ListView的以下模式 我的读物只指出了一个事实,即静态内部类被视为顶级类。 与成员类(非静态)相比,这样的东西有什么好处? @Override public View getView(int position, View convertView, ViewGroup parent) { Comment comment = getItem(position); ViewHolder holder; if (convertView == null){ holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null); holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.nickname.setText(comment.getMember_nickname()); CharSequence return convertView; } public static class ViewHolder{ TextView nickname; }

使用ViewHolder显示ListView中最后一个列表项的状态

int globalPosition ; ………….. buttonAllData.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new UploadBulkData(globalPosition).execute(); } }); …….. class UploadBulkData extends AsyncTask { private ProgressDialog pDialog; int dataPosition; public UploadBulkData(int position){ this.dataPosition = position; } @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(UploadActivity.this); pDialog.setMessage(“Uploading…”); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } […]

即使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, […]