Давайте начнем с новых для 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, так как я не мог понять, как отличать сенсорные события от их местоположения в одиночку.
Новичкам на Java нужно потратить время на изучение Java, прежде чем попасть в разработку Android. – CommonsWare
Я бы не назвал себя новичком. Возможно, новичок, я изучаю Java уже год, мой первый язык. Некоторые люди могут быть более чем новичком через год, но я не могу тратить на него столько времени, сколько захочу. – ChrisWilson4
Настройка прослушивателя в цикле while кажется мне очень плохой практикой. – StoneBird