在适配器中单击一行,如何更新相邻行的视图?

时间:2016-10-14 17:12:51

标签: android listview adapter listadapter

我尝试了两种方法。 我想做的是给得分最高的球员一个奖杯,然后当另一个球员得分更高时将其拿走。这两种尝试都是基于适配器的,而不是在它之外。我相信这可能是不可能的,因为适配器被设计为视图提供者而不是编辑器。

我尝试的第一种方式,跟踪高分,以及适配器中带有全局变量的行的奖杯ImageView。因此,当一个新的高分出现时,我将旧的高分看不见并更新了全局。这有效,但它没有更新数据集,所以当它滚出屏幕时,它忘记了前导行的奖杯图像。

因此,我没有复制Trophy获胜的ImageView,而是尝试编辑数据集,方法是通过将适配器父级转换为(ListView)然后获取其子级来访问Trophy ImageView。

NotifyDataChange()似乎阻止了这一点。有了这个注释,它引起了一个异常,其中行抄袭了奖杯获胜者得分。

从阅读开始,我相信在onClick事件之后,我可能会在我在ListView上设置适配器的类中隐藏前得分领导者的奖杯ImageView。但我不知道该怎么做。

这是目前令人难以置信的代码:

class InputData
{
   public int dataId;
   public int dataQtr;
   public string dataThing;

   public InputData(int DataId, int DataQtr, string DataThing)
   {
       dataId = DataId;
       dataQtr = DataQtr;
       dataThing = DataThing;
   }
}

//----------------------------------------------------

List<InputData> input_rows = new List<InputData>
{
   new InputData(1, 1, "chair" ),
   new InputData(1, 1, "mug" ),
   new InputData(1, 2, "bottle" ),
   new InputData(1, 3, "dog" ),
   new InputData(2, 2, "snake" ),
   new InputData(2, 3, "horse" ),
   new InputData(3, 2, "cup" ),
   new InputData(3, 3, "boomerang" ),
   new InputData(3, 3, "girl" ),
   new InputData(3, 4, "walkman" ),
};

Dictionary<int, List<InputData[]>> d = new Dictionary<int, List<InputData[]>>();

foreach( var row in input_rows )
{
   List<InputData[]> list;
   if( !d.TryGetValue( row.dataId, out list ) )
   {
      var a = new InputData[4];
      a[row.dataQtr - 1] = row;
      d.Add( row.dataId, new List<InputData[]> { a } );
   }
   else
   {
      var fa = list.FirstOrDefault( a => a[row.dataQtr - 1] == null );
      if( fa == null )
      {
         var a = new InputData[4];
         a[row.dataQtr - 1] = row;
         list.Add( a );
      }
      else
      {
         fa[row.dataQtr - 1] = row;
      }
   }
}

//--is there a way I could eliminate to the 2 sub foreach loops here?  How?
foreach(var pr in d)
{
   List<InputData[]> a = pr.Value;
   foreach(var b in a)
   {
      foreach (var c in b)
      {
         if (c != null)
            Console.WriteLine(c.dataThing);
      }                        
   }
   Console.WriteLine(pr.Key);  //--I want to display c.dataThing on the same line as pr.Key
}    

这是一张图片,我想要这个没有错误,请帮忙! :) enter image description here

1 个答案:

答案 0 :(得分:1)

我要做的是将奖杯作为一个字段放在填充列表的对象中(例如boolean isHighScore = true;),然后循环列表中的所有对象并使它们全部为假,除了带有得分最高。这样,当列表中的视图被销毁并重新创建时,奖杯的ImageView将仅在isHighScore==true时显示,否则会隐藏它。