Android 带有两个 ArrayList 的 ListView 适配器
Android ListView adapter with two ArrayLists
在我们的聊天应用程序中,我们想使用很酷的新库 SQLBrite 来根据数据库更改更新聊天。由于我们的聊天有无限滚动,并且聊天室可以有非常大的消息列表,我们希望将提供给 Chat ListView 适配器的 ArrayList 拆分为两个列表。检查图形的想法。
- 我们想在数据库中设置一个点,在这个点之上,旧消息将被正常的 SQLite 查询查询。在该点以下,我们需要设置 SQLBrite,这将为我们带来添加到数据库的新消息。
- 每个部分都应填充其对应的 ArrayList。并且两个arrayLists应该合并在一个适配器中。
我的问题可以吗?如果是,我们如何在单个适配器中组合和处理两个动态 ArrayList?
编辑 1
1. 我需要在重置期间保持聊天滚动位置,并且在 ArrayLists 更新期间不闪烁。
yes that is possible inside BaseAdapter getCount method write following code
@Override
public int getItemCount() {
return list1.size()+list2.size();
}
在 getView 方法中,您可以执行如下操作
public View getView(int position, View convertView, ViewGroup viewGroup) {
if(position < list1.size) {
Object object = list1.get(position);
//write code to inflate view here related to list 1
}
else {
Object object = list2.get(position - list1.size());
//write code to inflate raw here related to list 2
}
}
1.With 在泛型的帮助下,你可以用一个 ArrayList 处理两个 arraylist。
例如在适配器中:
setListData(ArrayList<T> pListData)
{
mListData=pListData;
}
在视图中
getView(int position, View convertView, ViewGroup parent){
T commonModel= getItem(position);
if(T instanceof ArrayListOneModel){
ArrayListOneModel model1=(ArrayListOneModel)T;
do stuf for first arraylit...
}
}
- 如果您使用相同的模型,您可以为两个数组列表设置一个类型(枚举)
&在放映期间您可以查看。
3.Otherwise 你可以先在arraylist中添加旧数据,然后使用collection
addAll() 添加第 2 个最新消息列表。然后
adapter.notifyDataSetChanged()
将设置第一个旧消息,然后将在您的列表中设置最新消息
更多说明:
在第二种方法中,如果两个 arraylist 都有不同的模型,则在两个模型中都包含一个枚举作为 setter getter.
public enum eType{
FIRST_LIST_TYPE,SECOND_LIST_TYPE
}
在从不同数据库的集合中获取数据时输入模型。
例如
public class model{
private enum eType;
// 来自您数据库的其他 setter getter 值
/**
* Setter getter:
*/
public void seteType(enum eType)
{
this.eType = eType;
}
public enum geteType()
{
return eType;
}
}
在获取数据集期间键入例如
Model model = new Model();
model.seteType(eType.FIRST_LIST_TYPE) ;
//same for 2nd db.
& simply check type inside getView() according to your requirement.
是的,你可以做到。但是 两个 arraylist 应该有共同的数据格式。
例如..
在适配器中,您可以制作类似
的方法
public void addMessages( <your_array_list> data ) {
list.addAll(data); //where list is your data container
}
现在你可能有两个arraylist
喜欢
ArrayList<your_type> oldMsg;
ArrayList<your_type> newMsg;
..
..
...
.
.
所以你可以调用我们创建的适配器方法
yourAdapter.addMessages(oldMsg);
yourAdapter.addMessages(newMsg);
adopter 中只能传递一个列表,这意味着你必须合并两个数组。
为了合并两个数组。它们必须是同一类型,即相同自定义对象的数组。
如果数组是动态更新的,则随着数据的变化再次合并数组,并每次调用 notifyDataSetChanged()
,以反映列表视图中的变化
在我们的聊天应用程序中,我们想使用很酷的新库 SQLBrite 来根据数据库更改更新聊天。由于我们的聊天有无限滚动,并且聊天室可以有非常大的消息列表,我们希望将提供给 Chat ListView 适配器的 ArrayList 拆分为两个列表。检查图形的想法。
- 我们想在数据库中设置一个点,在这个点之上,旧消息将被正常的 SQLite 查询查询。在该点以下,我们需要设置 SQLBrite,这将为我们带来添加到数据库的新消息。
- 每个部分都应填充其对应的 ArrayList。并且两个arrayLists应该合并在一个适配器中。
我的问题可以吗?如果是,我们如何在单个适配器中组合和处理两个动态 ArrayList?
编辑 1 1. 我需要在重置期间保持聊天滚动位置,并且在 ArrayLists 更新期间不闪烁。
yes that is possible inside BaseAdapter getCount method write following code
@Override
public int getItemCount() {
return list1.size()+list2.size();
}
在 getView 方法中,您可以执行如下操作
public View getView(int position, View convertView, ViewGroup viewGroup) {
if(position < list1.size) {
Object object = list1.get(position);
//write code to inflate view here related to list 1
}
else {
Object object = list2.get(position - list1.size());
//write code to inflate raw here related to list 2
}
}
1.With 在泛型的帮助下,你可以用一个 ArrayList 处理两个 arraylist。
例如在适配器中:
setListData(ArrayList<T> pListData)
{
mListData=pListData;
}
在视图中
getView(int position, View convertView, ViewGroup parent){
T commonModel= getItem(position);
if(T instanceof ArrayListOneModel){
ArrayListOneModel model1=(ArrayListOneModel)T;
do stuf for first arraylit...
}
}
- 如果您使用相同的模型,您可以为两个数组列表设置一个类型(枚举) &在放映期间您可以查看。
3.Otherwise 你可以先在arraylist中添加旧数据,然后使用collection addAll() 添加第 2 个最新消息列表。然后
adapter.notifyDataSetChanged()
将设置第一个旧消息,然后将在您的列表中设置最新消息
更多说明: 在第二种方法中,如果两个 arraylist 都有不同的模型,则在两个模型中都包含一个枚举作为 setter getter.
public enum eType{
FIRST_LIST_TYPE,SECOND_LIST_TYPE
}
在从不同数据库的集合中获取数据时输入模型。 例如
public class model{
private enum eType;
// 来自您数据库的其他 setter getter 值 /** * Setter getter: */
public void seteType(enum eType)
{
this.eType = eType;
}
public enum geteType()
{
return eType;
}
}
在获取数据集期间键入例如
Model model = new Model();
model.seteType(eType.FIRST_LIST_TYPE) ;
//same for 2nd db.
& simply check type inside getView() according to your requirement.
是的,你可以做到。但是 两个 arraylist 应该有共同的数据格式。 例如.. 在适配器中,您可以制作类似
的方法public void addMessages( <your_array_list> data ) {
list.addAll(data); //where list is your data container
}
现在你可能有两个arraylist 喜欢
ArrayList<your_type> oldMsg;
ArrayList<your_type> newMsg;
..
..
...
.
.
所以你可以调用我们创建的适配器方法
yourAdapter.addMessages(oldMsg);
yourAdapter.addMessages(newMsg);
adopter 中只能传递一个列表,这意味着你必须合并两个数组。 为了合并两个数组。它们必须是同一类型,即相同自定义对象的数组。
如果数组是动态更新的,则随着数据的变化再次合并数组,并每次调用 notifyDataSetChanged()
,以反映列表视图中的变化