2012-04-02 4 views
0
public class ExpAdapter : BaseExpandableListAdapter 
{ 
    private int seed = 1000; 

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService); 
      convertView = inflater.Inflate(Resource.Layout.inspection_row_2, null); 
     } 

     int currentID; 
     Random randomizer = new Random(seed); 

     TextView question = (TextView) convertView.FindViewById(Resource.Id.questionText); 
     RadioGroup radio = (RadioGroup) convertView.FindViewWithTag("actionGroup"); 
     currentID = randomizer.Next(1,101); 
     radio.Id = currentID; 
     RadioButton pass = (RadioButton) convertView.FindViewWithTag("passed"); 
     currentID = randomizer.Next(1,101); 
     pass.Id = currentID; 
     RadioButton fail = (RadioButton) convertView.FindViewWithTag("failed"); 
     currentID = randomizer.Next(1,101); 
     fail.Id = currentID; 
     RadioButton correct = (RadioButton)convertView.FindViewWithTag("corrected"); 
     currentID = randomizer.Next(1,101); 
     correct.Id = currentID; 
     RadioButton na = (RadioButton)convertView.FindViewWithTag("na"); 
     currentID = randomizer.Next(1,101); 
     na.Id = currentID; 

     string[][] items = questions.childItems(); 
     question.Text = items[groupPosition][childPosition]; 

     seed++; 

     return convertView; 
    } 
} 

중단 점을 사용하여 위의 단계를 수행하려면 currentID = 1을 실행하는 것이 좋습니다. MonoDroid는 부모 그룹 아래에 자식 컨트롤 그룹을 만들고 currentID는 ALWAYS = 1이므로 위 메서드는 반복적으로 호출됩니다. 전체 클래스에서 private static 변수로 currentID 및 randomizer를 만들려고했습니다. 같은 결과.C# 임의로 항상 동일한 번호

편집 : GetChildView를 호출 할 때마다 시드 값이 다른 새 임의 인스턴스를 만들려고했습니다. 위 코드는 내가 어떻게했는지 보여주기 위해 편집되었습니다. 여전히 currentID의 값은 항상 1입니다. 아래는 Locals의 랜더 마이저에 대한 정보 스크린 샷입니다. 이 정보는 시드 번호와 관계없이 동일하게 보입니다. ???

enter image description here

+1

랜덤 라이저에 씨앗을 먹이려고 했습니까? –

+0

예. 같은 결과. 또한, 내 예제에서 시드를 사용하면 반복 할 때마다 동일한 숫자가 생성된다는 것을 이해합니다. 번호가 개체의 ID에 사용되고 있으며 고유해야합니다. – jmease

+0

당신이 나에게 묻고있는 것을 이해하지 못합니다. DateTime을 사용하여 새로운 무작위 객체를 만든 다음 다음 임의의 숫자를 5 번 잡아서 GetChildView의 다음 반복 전에 5 월에 새로운 무작위 객체가 현재 DateTime을 기반으로 만들어지기를 기대합니다. – jmease

답변

0

랜덤 마이저 밀리 초로 시스템 시간으로 계산된다. 그래서, 똑같은 밀리 세컨드로 빠르게 호출하면 동일한 번호로 시드 (seed)되어 같은 난수가됩니다.

+0

네,하지만 난 하나의 랜덤 개체를 만들고 새 메서드를 만들기 전에 5 번에 Next 메서드를 호출하고 있습니다. 다음 밀리 세컨드 객체가 동일한 밀리 초 안에 생성 되더라도 적어도 하나의 객체의 값은 Next를 호출 할 때마다 바뀌지 않을까요? – jmease

+0

@jmease 코드는 .NET 4.0에서 기본 시간 기반 시드로 시드되거나 그렇지 않으면 정상적으로 작동합니다. 그것은 플랫폼 특정 문제처럼 보입니다. –

+0

@ 리차드 헤인, 네가 맞을지 모른다. MonoDroid는 지금까지 조금 버그가 있습니다. Random 클래스를 사용하는 대신 고유 ID를 할당하기 위해 증가 된 시드 변수를 사용하기로 결정했습니다. 목적을 달성하는 것 같습니다. – jmease