Android 重用ListAdapters和列表

Android 重用ListAdapters和列表,android,listview,Android,Listview,我正在寻找一种在稍微不同的上下文中重用数据列表的有效且可重用的方法 我有如下列表: [Bitmap] PlayerName [Bitmap] PlayerName ... 它们存储为我从游标获取的ArrayList,并且可以打包,以便我可以根据需要移动它们 我的问题是,我想重复使用图像和名称,但改变了行内的信息 我的意思是: [Bitmap] PlayerName [Bitmap] PlayerName ... 当我显示第一个列表中的玩家时,我有一个移除按钮,可以将该玩家从整个游

我正在寻找一种在稍微不同的上下文中重用数据列表的有效且可重用的方法

我有如下列表:

[Bitmap] PlayerName  
[Bitmap] PlayerName 
...
它们存储为我从游标获取的ArrayList,并且可以打包,以便我可以根据需要移动它们

我的问题是,我想重复使用图像和名称,但改变了行内的信息

我的意思是:

[Bitmap] PlayerName  
[Bitmap] PlayerName 
...
当我显示第一个列表中的玩家时,我有一个移除按钮,可以将该玩家从整个游戏中移除

在另一个列表中,我也使用了一个删除按钮,但这是从游戏的特定实例中删除它们

在这两种情况下,我都有一个带有列表的
Remove
按钮,我在构建ListaApter时使用lazy hackery来选择按钮的作用。listitems本身没有侦听器,只有按钮

我现在想再次使用播放器列表,但要使整个项目都可以单击(即使用OnItemClickListener或类似的工具),然后在它们旁边放置一个数字(按单击顺序)

我想我可以在
Remove
框下添加一个TextView,然后将其连接到同一个东西中,并根据需要使TextView和按钮可见,但这似乎是一种非常糟糕的管理方式

在本例中,如何将演示文稿与数据分开

潜在解决方案

1. 根据关于使用布局的建议,我有这样一个构造函数:

public PlayerListAdapter(Context context, ArrayList<Player> players, GameInstance gameInstance) {
    super(context, R.layout.row_player_empty, players);
    this.context = context;
    this.players = players;
    this.gameInstance = gameInstance;
}
PublicPlayerListAdapter(上下文上下文、ArrayList播放器、GameInstance游戏实例){
超级(上下文,右布局。行\玩家\空,玩家);
this.context=上下文;
这个。玩家=玩家;
this.gameInstance=gameInstance;
}
我是否会将布局的int添加到该构造函数中,然后更改getView和onClick方法以使用布局来驱动不同的数据源

2.

我研究过的另一个解决方案是“合并”布局。在这里,我创建了一个基本的“player”,然后针对每一组额外的UI元素,我将基本元素包装成一个新的布局。这至少意味着我正在使用字体/大小/边距等


我可能更愿意动态地覆盖元素,但至少如果我更改基本样式,我将只做一次而不是三次。

您可以使用不同的xml来管理这两个列表。 从fragment/activity中,您可以传递正在查看的列表视图的类型,并且在depneds上,您的XMLOut2布局将膨胀,您可以设置值

在第一种情况下,您只需要删除按钮clickable,这样您就可以只在上面设置listener;在第二种情况下,您需要整个按钮clickable,这样您就可以在设置这种列表视图xml时设置onClickListner

因为您有两个案例: 在案例1中,您应该在构造函数中传递任何布尔值或枚举种类值,这样您就可以确定我需要填充哪种xml

在膨胀视图之前的getView()中,您应该比较该值,并根据该值填充xml,如:

getView(){
   if(case1){
     View view = mInflater.inflate(R.layout.case_one_layout, null);       
     //set all values and listener on delete button as your require.
   }else if(case2){
     View view = mInflater.inflate(R.layout.case_two_layout, null);
     //here you can set listener on entire row as onItemclick from fragment.
   }
}

您还可以使用switch或其他方式进行管理。

您可以使用不同的xml来管理这两个列表。 从fragment/activity中,您可以传递正在查看的列表视图的类型,并且在depneds上,您的XMLOut2布局将膨胀,您可以设置值

在第一种情况下,您只需要删除按钮clickable,这样您就可以只在上面设置listener;在第二种情况下,您需要整个按钮clickable,这样您就可以在设置这种列表视图xml时设置onClickListner

因为您有两个案例: 在案例1中,您应该在构造函数中传递任何布尔值或枚举种类值,这样您就可以确定我需要填充哪种xml

在膨胀视图之前的getView()中,您应该比较该值,并根据该值填充xml,如:

getView(){
   if(case1){
     View view = mInflater.inflate(R.layout.case_one_layout, null);       
     //set all values and listener on delete button as your require.
   }else if(case2){
     View view = mInflater.inflate(R.layout.case_two_layout, null);
     //here you can set listener on entire row as onItemclick from fragment.
   }
}

您也可以使用开关或其他方式进行管理。

我的理解是,您希望在其他列表中显示相同的数据,单击按钮时,您也希望显示“排名”,但当您单击按钮时,按钮将消失,只显示排名。无论我在哪里漏掉了,请纠正我。差不多了。但本质上,我希望在3个单独的列表中使用相同的基础数据,我想要的是以3种不同的方式与之交互,可能会以可重用的方式(尽可能多地)覆盖新元素并每次改变行为。如果要重用数据,为什么不使用数据库?或者将对象设置为静态的、可打包的,并在整个应用程序中移动它(第二个建议更像是一个快速修复)。这些数据确实来自数据库,但三个适配器中至少有两个显示相同的播放器。我会把它打包,但不需要在每个阶段都使用装载机。问题不是重用数据,而是重用ListAdapter我的理解是,您希望在其他列表中显示相同的数据,单击按钮时您也希望显示“排名”,但当您单击按钮时,按钮将消失,并且只显示排名。无论我在哪里漏掉了,请纠正我。差不多了。但本质上,我希望在3个单独的列表中使用相同的基础数据,我想要的是以3种不同的方式与之交互,可能会以可重用的方式(尽可能多地)覆盖新元素并每次改变行为。如果要重用数据,为什么不使用数据库?或者将对象设置为静态的、可打包的,并在整个应用程序中移动它(第二个建议更像是一个快速修复)。这些数据确实来自数据库,但三个适配器中至少有两个显示相同的播放器。我会把它打包,但不需要在每个阶段都使用装载机。问题不是重复使用数据,而是重复使用列表适配器。我在问题的底部添加了更多的细节,这就是你的建议吗?好的,我的建议如上所述。我已经部分调整了我的程序。我制作了一个带有“merge”的复合listview,然后将它合并到另外两个RelativeLayout中