- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的最终结果是一个简单的聊天气泡样式 ListView。
我也在使用 holder 的概念。
public class Holder {
TextView userName;
TextView message;
CheckBox box;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
Holder holder;
OneComment coment = getItem(position);
if (row == null) {
holder = new Holder();
if (coment.left) {
row = inflater.inflate(R.layout.listitem_left_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment);
holder.box = (CheckBox) row.findViewById(R.id.checkBox1);
} else {
row = inflater.inflate(R.layout.listitem_right_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment2);
holder.box = (CheckBox) row.findViewById(R.id.checkBox2);
}
holder.message.setText(coment.comment);
holder.box.setChecked(coment.left);
}
return row;
}
我得到了想要的结果。我仍然想知道这种方法是否正确。如果不是,哪种方法最好?
最佳答案
适配器可以处理不同的 View 。您应该覆盖两个方法:getViewTypeCount()
和 getItemViewType(int position)
。在你的情况下:
private static final int TYPES_COUNT = 2;
private static final int TYPE_LEFT = 0;
private static final int TYPE_RIGHT = 1;
@Override
public int getViewTypeCount() {
return TYPES_COUNT;
}
@Override
public int getItemViewType (int position) {
if (getItem(position).left) {
return TYPE_LEFT;
}
return TYPE_RIGHT;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
Holder holder;
OneComment coment = getItem(position);
if (row == null) {
holder = new Holder();
if (getItemViewType (position) == TYPE_LEFT) {
row = inflater.inflate(R.layout.listitem_left_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment);
holder.box = (CheckBox) row.findViewById(R.id.checkBox1);
} else {
row = inflater.inflate(R.layout.listitem_right_chat, null, false);
holder.message = (TextView) row.findViewById(R.id.comment2);
holder.box = (CheckBox) row.findViewById(R.id.checkBox2);
}
row.setTag(holder);
} else {
holder = (Holder)row.getTag();
}
holder.message.setText(coment.comment);
holder.box.setChecked(coment.left);
return row;
}
public class Holder {
TextView userName;
TextView message;
CheckBox box;
}
更新:
解释:
getItemViewType
应返回一个整数,用于标识将由 getView(int, View, ViewGroup)
为指定项目创建的 View 类型。如果可以在 getView
中将一个 View 转换为另一个 View ,则两个 View 应该返回相同的结果。
getViewTypeCount
应该返回一个整数,其中包含适配器将处理的 View 类型的数量。
在幕后,Android 使用 View 类型来确定应将哪种类型的 View 传递给 getView
方法。您可以将其视为创建多个可重复使用的 View 桶,从而避免每次新列表项可见时膨胀新 View 的惩罚。
当用户向下滚动 ListView 时,框架将回收不再可见的行,并将它们添加到适当的桶中以供重复使用。当一个新的 Header 或 Event 项目进入 View 时,框架将检查这些 View 之一是否已经存在于回收 View 的桶中,如果存在,它将作为 convertView
传递给 getView
方法。
关于android - Android 适配器 getView() 中 2 种布局的动态膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23540520/
我想要自定义微调器,在下拉列表中包含图像和 TextView ,因此我创建了不同的布局并对其进行了膨胀,其工作正常,但对于按微调器之前的微调器布局,我只想有一个类似“选择”的文本来自列表”但是当我用
所以我正在开发实时 ListView ,我需要 ListView 在单击按钮时更新,这些也是如此: private void ReloadData(){ DataList.clear();
我知道其他人也问过这个问题,但我看过其他解决方案,但仍然无法使其发挥作用。 适配器代码: private class CustomTextAndImageAdapter extends ArrayAd
我有一个通过 asynctask 填充的自定义 ListView 适配器,我在 onprogress 函数中调用 notificationdatasetchanged,并且 getCount() 返回
我正在显示联系人列表。一切都很好,除了设备有 1620 个联系人,所以列表滚动非常慢,甚至有时会挂起。 请帮帮我。 我尝试使用检查 ConvertView!=null 的 getView 方法,但它总
我想在每张图片下方添加一个文本,这是我的实际代码: @Override public View getView(int position, View convertView, ViewGroup pa
我在 Adapter extensions override of getView 中经常看到这一点: @Override public View getView(int position,
我正在尝试在对话框中制作 ListView 。但是我的适配器中的 getView 函数永远不会被调用。有什么想法吗? 适配器: public class DialogAdapter extends B
我有 public class MainActivity extends FragmentActivity 我编写了实现 AsyncResponse 的 Loader 类: public class
我有这样一段代码:)我想编辑我的自定义首选项布局的文本属性。但是从 getView 函数对对象所做的任何更改都不会影响首选项屏幕中的实际列表。有任何想法吗?我知道我不能扩展 PreferenceScr
我有一个扩展 simplecursoradapter 的适配器。新 View 应该从数据库中获取光标和图像,用几个复选框填充列表。出于某种原因,我似乎看不到,我的 getView 甚至没有被调用。我在
谁能解释一下这两种 getView() 实现之间的区别是什么? 第一个简单地检查 convertView 是否为 null;如果它为 null,则膨胀一个新的 View 对象。然后给子View设置合适
我做了一个 SingleItemAdapter extends ArrayAdapter,这个定制的 Adapter 用于 ListView。 在这个 SingleItemAdapter 中,我做了一
这里是相当新的 Android 开发者。 我遇到了一个奇怪的问题,我不确定如何解决。我在这里阅读了很多问题,听起来它们与我遇到的问题相同,但他们问题的解决方案似乎永远不适用于这里发生的事情。 我使用扩
我有一个带有 ListFragment 的自定义适配器,但根本没有调用适配器 getView()。 这是适配器的样子 - public class ModuleListItemAdapter exte
我正在将自定义 SimpleCursorAdapter 设置为 ListView。出于某种原因,对于数据库中的每个项目,FriendAdapter 的 getView() 被调用两次。经过一些调查(我
我有一个包含自定义适配器和自定义行的列表。 问题是当我滚动 ListView 时,图像位于错误的位置... 这是自定义行 xml: 这是 GetView: List it
public View getView(int index, View view, ViewGroup parent){ if (view == null) { // for the firs
我添加了两个按钮(添加和删除)来控制 ListView ,当我删除一个项目时,该项目不会立即在 ListView 中消失,只有当我在 ListView 上滑动时,新项目才会消失。除非我触摸屏幕或在 L
我已经多次尝试在我的 Controller 上使用 this.getView(),但我总是在我的控制台上收到 getView is not a function 错误。 是否有任何“技巧”或我可以做的
我是一名优秀的程序员,十分优秀!