- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个用于实现自定义 ListView 的简单代码 fragment 。
我的代码如下:
天气适配器.java :
public class WeatherAdapter extends ArrayAdapter<weather>{
Context mcontext;
int mlayoutResourceId;
weather mdata[] = null;
View row;
public WeatherAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
WeatherHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater();
row = inflater.inflate(mlayoutResourceId, parent, false);
holder = new WeatherHolder(row);
row.setTag(holder);
}
else
{
holder = (WeatherHolder)row.getTag();
}
weather w = mdata[position];
holder.txtTitle.setText(w.mtitle);
holder.imgIcon.setImageResource(w.micon);
return row;
}
WeatherHolder.java:
class WeatherHolder
{
ImageView imgIcon;
TextView txtTitle;
public WeatherHolder(View v){
imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
txtTitle = (TextView)row.findViewById(R.id.txtTitle);
}
}
}
在SO等网站上看到了很多答案,明白了listview的回收机制。
我还了解到,从 viewholder 中,我们可以在适配器中保存 subview ,而不必多次调用 findViewById()
。所以,这是为了优化。
但我只对 setTag(holder)
和 getTag()
方法感到困惑。 From this question ,我才知道它是为了在多个对象上做一个键值对,这样我们就可以方便地访问它们。但是,我不明白为什么这里需要它们……因为,我们没有多个持有人对象……只是我们每次都必须更改持有人的变量。我们可以在此处编码而不使用 setTag
和 getTag
吗?
谁能更好地解释一下 setTag
和 getTag
“这里”做了什么?
最佳答案
tag
是一种让您的 views
记住某些东西的机制,它可以是 object
一个 integer
a string
或您喜欢的任何内容。
因此,当您的 ListView
将首次创建时,您的 convertView
为 null
。所以你创建了一个新的 convertView
并将那个 row
的 objects
的所有 references
放在 >viewHolder
。然后将您的 viewHolder
保存到该 convertView
(setTag) 的内存中。 Android
将你的 convertView
放入它的 pool
以回收
并通过
再次给你。但是它的 pool
可能没有足够的 convertViews
所以它再次传递一个新的 convertView
那是 null
。所以再次重复这个故事,直到 android
的 pool
被填满。之后 android
从它的池中获取一个 convertView
并将其传递给您。你会发现它不是null
所以你问它我第一次给你的对象references
在哪里? (getTag) 这样您就可以获取这些标签并随心所欲。
下面一行的详细说明
但它的池可能没有足够的 convertView,所以它再次传递一个新的 convertView,它是 null
android pool
在您的 listView
将要创建时是空的。因此,对于您的 listView
的第一项,它会向您发送一个必须显示的 convertView
。之后 android
将它保存在它的 pool
中,所以它的 pool
现在只包含一个 convertView
。对于要创建的 listView
的第二个项目,android 不能使用它的池,因为它实际上有一个元素,而那个元素是你的第一个项目,它现在正在显示,所以它必须传递另一个 convertView
。重复此过程,直到 android
在其 pool
中找到一个现在未显示的 convertView
并将其传递给您。
当你滚动它使用 holder 的列表时,Android 会膨胀每一行直到屏幕被填满。
关于android - ViewHolder 模式中的 setTag 和 getTag 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966689/
最近我使用 RecyclerView 并添加了一个自定义标题 View (另一种类型的项目 View )并尝试在数据发生更改时对其进行更新。奇怪的事情发生了。适配器创建一个新的 HeaderViewH
我的项目应该基于用户输入(用户发送文本、拍照或录制视频)创建多个 View ,类似于 WhatsApp 聊天 Activity ,结构几乎相同。适配器应该能够通过使用 getItemViewType(
在 ViewHolder pattern 中将 ViewHolder 设为静态对性能至关重要吗? ? A ViewHolder object stores each of the component
我只是想更好地理解我经常用来优化 ListView 的以下模式 我的阅读只指出静态内部类被视为顶级类的事实。与成员类(非静态)相比,这样的事情有什么好处? @Override public View
我有一个 RecyclerView 和一些 view/card(我们暂时称它为 View ),它们都包含相同的东西,包括我用作分隔栏的 View。 我希望能够在当前 View 上方的 view 中更改
我需要从 View Holder 访问 RecyclerView Adapter 的方法。我找不到任何解决方案。 或者是否可以从 ViewHolder 的 ViewModel 类(我已经在 MVVM
在我的 RecyclerView 适配器中只有一个 ViewHolder 类: public static class PlayerItemViewHolder extends RecyclerVie
我已经采用了一个示例代码来实现 RecyclerView,但试图将其转换为在我的应用程序的子 fragment 中工作。 代码在“创建列表 - 示例”下 Creating Lists and Card
我试图在我的主要 Activity 中而不是在我的自定义适配器中保存复选框的状态。我已检查共享首选项中是否存储了正确的数据,并且可以成功检索信息,但是当我尝试在打开应用程序时标记复选框时, View
我是 Kotlin 的新手,我正在制作一款货币兑换应用。在适配器中,我想将一些项目传递到新 Activity 中。 class AdapterC (val countryList: ArrayLis
我在我的代码中遇到了这个问题,当在 Viewholder 中的一个按钮上进行转换时,这是在 Onclicklistener 中完成的,多个转换发生在不同的行上即,如果我单击第 1 行中的按钮,则按钮向
public class ListViewAdapter extends BaseAdapter { private Context context; private LocationDetails[
我刚刚生成了一个 Master/Detail Flow 项目,我发现了一些奇怪的东西:在 DriverListActivity.java 中,名为 ViewHolder 的子类具有 final 属性。
我正在尝试配置抽屉导航以显示 3 种不同类型的“行”,但我在使用 Holder 时遇到了问题,被告知该消息: FATAL EXCEPTION: main java.lang.ClassCastExce
我理解Viewholder pattern的思路和用法,但我仍然有一个问题: 假设我们在 viewholder 中有一个 TextView,并显示 10 个项目(“item0,item1 ....”)
我有一个包含 3 种不同类型行的 ListView 。我在网上收到 ClassCastException holder = (RowViewHolder) row.getTag(); 我注意到 row
我正在尝试学习 Android 编程。我找不到这个算法的解释: public View getView(int r, View convertView, ViewGroup parent) { V
我正在创建一个 Android 应用程序,其中包含一个带有嵌套 CardView 的 RecyclerView。我需要将所有其他卡片替换为不同的颜色。我正在使用 @Override 来覆盖 onBin
我在 ListView 中使用分段时遇到问题。我需要使用 viewholder 使 listview 滚动平滑,但我不知道如何实现两个 viewholders,因为有两个单独的 View ,一个是部分
我在 ListView 上遇到了 View 持有者的充气问题。实现 Viewholder 后,充气机会出错,因此消息显示错误。 (在图 10 中,消息不是来 self ,而且每当我滚动时,错误的消息都
我是一名优秀的程序员,十分优秀!