2013-04-25 1 views
0

Давайте начнем с новых для android.Как правильно использовать setOnItemClickListener?

У меня есть настройка GridView как сетка, и я использую ее для представления платы для небольшого приложения для настольных игр, которое я делаю. Я установил «setOnItemClickListener» для моего GridView, который функционирует, по крайней мере для Toast, и установил ImageResource, который я поставил там для теста.

Я не знаю, как вызвать мои методы из других классов внутри ClickListener, чтобы контролировать, что происходит, когда затрагиваются проблемы. Кажется, что нет имени или чего-либо другого в сочетании с другими методами. Когда я пытаюсь поместить свой код внутри setOnItemClickListener, но я получаю предупреждение о том, что мой Object, класса, который я хочу вызвать из методов, должен быть окончательным для использования во внутреннем классе другого метода.

Я не могу изменить свои объекты в финал, поэтому мне нужен способ запустить небольшой игровой цикл, который будет вызывать все методы для объектов из других классов, которые мне нужны, обмениваясь данными с этим setOnItemClickListener.

Вот часть моего кода, который имеет Слушатель:

public View play(GridView gv) { 
    boolean p1turn = true; 
    while (gameOver == false) { 
     gv.setOnItemClickListener(new OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
       Toast.makeText(ctxt, "" + position, Toast.LENGTH_SHORT).show(); 
       ImageView img = (ImageView)v; 
       img.setImageResource(R.drawable.paper1select); 
      } 
     }); 
     System.out.println("Why no get here??"); 
     return(gv);//IDK why but this is NEVER reached, almost like the oICL is an infinite loop??? 
    } 
    return gv; 
} 

тост и два ImageView IMG линий внутри слушатель только для тестирования, чтобы увидеть, если он будет работать, и это делает для этих задач. Мне нужен способ использовать Listener в других местах моего кода.

Например, при первом касании я хотел бы вызвать метод, который я создал, который определит, является ли выбранный элемент подходящим устройством для перемещения, и если это необходимо, поменяйте изображение в этой позиции новым образ. Таким образом, это выглядело бы так, как я предполагал, - gv.onTouchEvent1.checkPiece (player1, position); - Где CheckPiece получит позицию от ClickListener и выполняет ее функцию.

Любое задание setOnItemClickListener было бы неплохо.

---------------- РЕДАКТИРОВАТЬ С МОЕМ РЕШЕНИЕМ -------------------------- ------

Единственный способ, с помощью которого я смог работать, был с помощью счетчика внутри onItemClick..., который позволил бы мне управлять тем, какой метод был вызван, в зависимости от того, что подсчитывал, используя операторы if вместе с петля. Это все еще в стадии разработки, так есть некоторые нежелательные, что я буду удалять позже, но это показывает, в основном, что мне нужно:

public class MainActivity extends Activity { 

/* 
* count used to keep track of which step of game-play we are on. pNum used 
* to track which player's turn it is. 
*/ 
protected static int count = 0, pNum = 0, round = 0; 

// Used to keep know that a step is done, in conjunction with count, 
// redundant I believe. TRUE indicates "done". 
protected static boolean choosePiece = false, chooseEmpty = false, 
     verifyEmpty = false, selectEnemy = false, verifyEnemy = false; 

// Used to track selected piece location. 
protected static int selectedLocation; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ImageAdapter iA = new ImageAdapter(this); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(iA); 

    final GameplayController gc = new GameplayController(this); 

    // Create board model, add units to player's list. 
    final UnitArray gameBoardModel = new UnitArray(); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 

      while (count <= 6) { 
       System.out.println("While loop cycle: " + round); 
       /* 
       * First IF is for selecting piece to move. 
       */ 
       if (count == 0) { 
        System.out.println("IF 0 WAS HIT"); 
        System.out.println("It is player " + pNum 
          + "s turn, round " + round); 
        choosePiece = gc.choosePiece(position, gameBoardModel, 
          (ImageView) v, pNum); 
        if (choosePiece == true) { 
         count++; 
        } 
        selectedLocation = position; 
        break; 
       } 
       /* 
       * Second IF is for selecting blank space to move to. 
       */ 
       if (count == 1 && choosePiece == true 
         && chooseEmpty == false) { 
        System.out.println("IF 1 WAS HIT"); 
        chooseEmpty = gc.chooseEmpty(position, gameBoardModel, 
          (ImageView) v); 
        if (chooseEmpty == true) { 
         count++; 
        } 
        break; 
       } 
       /* 
       * Third IF is for verifying the blank selected and moving 
       * piece. 
       */ 
       if (count == 2 && verifyEmpty == false 
         && choosePiece == true && chooseEmpty == true) { 
        System.out.println("IF 2 WAS HIT"); 
        verifyEmpty = gc.checkEmptyChoice(position); 
        if (verifyEmpty == true) { 
         gc.moveToEmpty(position, gameBoardModel, 
           (ImageView) v, selectedLocation); 
         count++; 
         iA.notifyDataSetChanged(); 
         selectedLocation = position; 
        } 
        break; 
       } 
       /* 
       * Fourth IF is for selecting an enemy unit to attack. 
       */ 
       if (count == 3 && selectEnemy == false 
         && verifyEmpty == true && choosePiece == true 
         && chooseEmpty == true) { 
        System.out.println("IF 3 WAS HIT"); 
        selectEnemy = gc.selectEnemy(position, gameBoardModel, 
          (ImageView) v); 
        if (selectEnemy == true) { 
         count++; 
        } 
        break; 
       } 

       /* 
       * Fifth IF is for verifying enemy unit to attack and then 
       * attacking. 
       */ 
       if (count == 4 && verifyEnemy == false 
         && selectEnemy == true && verifyEmpty == true 
         && choosePiece == true && chooseEmpty == true) { 
        System.out.println("IF 4 WAS HIT"); 
        verifyEnemy = gc.verifyEnemySelected(position); 
        if (verifyEnemy) { 
         /* 
         * For clarity, position is enemy being attacked, 
         * selectedLocation is position of attacking unit. 
         */ 
         gc.attackEnemy(position, gameBoardModel, 
           (ImageView) v, selectedLocation); 

         // RESET FOR NEXT PLAYER TURN. 
         iA.notifyDataSetChanged(); 
         if (pNum == 0) { 
          pNum = 1; 
         } else { 
          pNum = 0; 
         } 
         iA.notifyDataSetChanged(); 
         count = 0; 
         choosePiece = false; 
         chooseEmpty = false; 
         verifyEmpty = false; 
         selectEnemy = false; 
         verifyEnemy = false; 
         round++; 
        } 
        break; 
       } 
      } 
     } 
    }); 
} 
... 

Это только мне кажется странным, чтобы иметь так много кода происходит в onItemClick. Мое первоначальное намерение состояло в том, чтобы вызвать метод, который в значительной степени содержал все, что я вложил в onClick, так как я не мог понять, как отличать сенсорные события от их местоположения в одиночку.

+3

Новичкам на Java нужно потратить время на изучение Java, прежде чем попасть в разработку Android. – CommonsWare

+0

Я бы не назвал себя новичком. Возможно, новичок, я изучаю Java уже год, мой первый язык. Некоторые люди могут быть более чем новичком через год, но я не могу тратить на него столько времени, сколько захочу. – ChrisWilson4

+0

Настройка прослушивателя в цикле while кажется мне очень плохой практикой. – StoneBird

ответ

2

Я бы не назвал себя новичком

Ummmm ...

Когда я пытаюсь поставить свой код внутри setOnItemClickListener, но я получаю предупреждение о том, что мой объект, класса, который я хочу назвать методами из, должен быть окончательным для использования во внутреннем классе другого метода.

Это потому, что указанные объекты являются либо параметры для setOnItemClickListener() или локальные переменные, в противоположность данных членов класса, где ваш метод play() находится.

Имейте в виду, что OnItemClickListener - это интерфейс, поэтому вам не нужно использовать анонимный внутренний класс, как вы сейчас. Например, вы можете реализовать этот интерфейс на Activity, который (предположительно) принимает метод play().

Анонимные внутренние классы - это мощная, но экспертная техника Java. Я преподал много курсов для Android, и есть много опытных разработчиков Java, которые не признают, не говоря уже об использовании, анонимных внутренних классов. Учитывая ваш относительный уровень опыта, я бы рекомендовал вам избегать их использования в любое время, где это возможно.

Вот часть моего кода, который имеет Слушатель

Вы звоните setOnItemClickListener() в цикле. Это, вероятно, не то, что вы хотите.

Мне нужен способ использовать прослушиватель в других местах моего кода.

Нет, вы этого не сделаете. Возможно, вам нужно, чтобы слушатель делал другие вещи из своего метода onItemClick(), но сам слушатель, как объект, будет использоваться только в одном месте, за исключением некоторого серьезно странного кодирования.

Так что это выглядело бы так, как я мог себе представить - gv.onTouchEvent1.checkPiece (player1, position); -

Или реализовать checkPiece() на Activity, который (предположительно) хостинг весь этот код, в этом случае вы просто называете его.

Я изучаю Java уже в течение года, мой первый язык

Чтобы быть полностью тупой, ваши проблемы имеют мало общего с Android и все, что с Java. Не стесняйтесь задавать java-синтаксис и связанные с ним вопросы здесь, в StackOverflow, но делайте это с тегом (возможно, в дополнение к тегу ), если он скорее всего будет больше связан с Java, а тем более - с классами и методами Android.

+0

Спасибо, что обратились к моим проблемам индивидуально.Я попытаюсь реализовать его так, как вы сказали сейчас, дайте мне время, и я вернусь с ответом. – ChrisWilson4

+0

Я не могу понять, как вызвать метод 'onItemClick()'. Нет имени 'setOnItemClickListener()', чтобы вызвать его так: 'setOICLtheName.onItemClick();'. Я буду продолжать работать над этим. – ChrisWilson4

+0

Я пробовал с основным видом деятельности и GridView, 'gridview.onItemClick();' и 'MainActivity.this.onItemClick();'. – ChrisWilson4