[Android] Zmiana tekstu TextView losowym ciągiem z tablicy

0

Cześć. Chcę aby po każdym dotknięciu/kliknięciu przycisku nextButton losowany był numer indeksu n i następnie z tablic englishWords i polishWords wyciągamy słowa o tym właśnie indeksie i dodatkowo numer indeksu dodajemy do listy notAvailableIndexes, po to żeby nie dublować później losowanych słów. Jednym z problemów jest np. to, że po kliknięciu przycisku losowanie odbywa się tak jakby dwa razy, teksty dwóch TextView są w krótkim czasie aktualizowane dwa razy (po jednym kliknięciu). Co poprawić w poniższym kodzie?

LearnGreetingsActivity.java

package com.blogspot.dammarpol.polishforforeigners;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.blogspot.dammarpol.polishforforeigners.LearnGreetings.*;

public class LearnGreetingsActivity extends Activity{
	
	TextView englishExpression;
	TextView polishExpression;
	ProgressBar progressBar;
	Button nextButton;
	
	private List<Integer> drawIndex(VocabularyLists lists, List<Integer> notAvailableIndexes, Button nextButton, Random rand){
		
		boolean found = false;
		int n;
		
		do{
			
			n = rand.nextInt(lists.englishWords.length);
			if(notAvailableIndexes.contains(n)){
				found = false;
			}
			else{
    		englishExpression.setText(lists.englishWords[n]);
            polishExpression.setText(lists.polishWords[n]);
            notAvailableIndexes.add(n);
    		found = true;
			}
			
		}while(found);
		return notAvailableIndexes;
	}
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.learn_greetings);
        
        final VocabularyLists lists = new VocabularyLists();
        final List<Integer> notAvailableIndexes = new ArrayList<Integer>();
        nextButton = (Button) findViewById(R.id.nextButton);
        final Random rand = new Random();
        englishExpression = (TextView) findViewById(R.id.learnGreetingsEnglish1);
        polishExpression = (TextView) findViewById(R.id.learnGreetingsPolish1);
      
        
        nextButton.setOnTouchListener(new OnTouchListener() {
        	 
			@SuppressLint("ClickableViewAccessibility") @Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				
				 drawIndex(lists, notAvailableIndexes, nextButton, rand); 
				return true;
			}
        });
    }

}

VocabularyLists.java

package com.blogspot.dammarpol.polishforforeigners.LearnGreetings;

import java.util.ArrayList;
import java.util.List;

public class VocabularyLists{
	
	public String[] englishWords = {"Good morning", "Good afternoon", "Good evening", "Good night", "Goodbye", "Hello", "Nice to meet you"};
	public String[] polishWords = {"Dzień dobry", "Dzień dobry", "Dobry wieczór", "Dobranoc", "Do widzenia", "Cześć", "Miło cię poznać"};	 
}
0

Spróbuj zamienić setOnTouchListener na setOnClickListener

0

ok, zmieniłem to, w zasadzie wcześniej na początku było setOnClickListener ale wyrzucało mi błąd i Eclipse proponował zamienić na setOnTouchListener i tak zrobiłem ale ok teraz już jest lepiej, nie ma tego efektu podwójnego losowania na raz. Sprawdź jeszcze czy wszystko jest dobrze z dodawaniem i zwracaniem listy notAvailableIndexes, coś z tym jeszcze chyba szwankuje...

0

tak btw nie łatwiej zrobić klasę typu

class QuestionAnswer {
	private String question;
	private String answer;

	public QuestionAnswer(String question, String answer) {
		this.question = question;
		this.answer = answer;
	} //itd...

a po wylosowaniu z List<QuestionAnswer> czy czegokolwiek tam po prostu usuwać już odpytany rekord?

0

Dobra, zrobiłem taką klasę jak powiedziałaś, dodatkowo elementy dodaję do listy, później je tasuję przez shuffle i wybieram pierwszy element, który następnie usuwam z listy żeby nie był brany po raz drugi pod uwagę. Jednak dostaję błąd, że w LearnGreetingsActivity w java.util.List.add dodaję nulla. Co jest nie tak?

LearnGreetingsActivity.java


import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class LearnGreetingsActivity extends Activity{
	
	TextView englishExpression;
	TextView polishExpression;
	ProgressBar progressBar;
	Button nextButton;
	
	private void drawIndex(List<QuestionAnswer> list2){
		ShuffleAndChoose shuffle = new ShuffleAndChoose(list2);
		englishExpression.setText(shuffle.getFirstAndRemove().getQuestion());
		polishExpression.setText(shuffle.getFirstAndRemove().getAnswer());
	}
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.learn_greetings);
        
        
        GreetingsActivity greetingsAct = new GreetingsActivity();
        final List<QuestionAnswer> greetings = greetingsAct.getList();
        
        nextButton = (Button) findViewById(R.id.nextButton);
        
        englishExpression = (TextView) findViewById(R.id.learnGreetingsEnglish1);
        polishExpression = (TextView) findViewById(R.id.learnGreetingsPolish1);
        
        nextButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				nextButton.setText("Next"); 
				drawIndex(greetings); 
			}
        });
    }

}

GreetingsActivity.java


import java.util.ArrayList;
import java.util.List;
import com.blogspot.dammarpol.polishforforeigners.QuestionAnswer;

public class GreetingsActivity {
	
	private List<QuestionAnswer> greetingsList;
	
	public GreetingsActivity(){
	        QuestionAnswer expression1 = new QuestionAnswer("Good morning", "Dzień dobry");
	        QuestionAnswer expression2 = new QuestionAnswer("Good afternoon", "Dzień dobry");
	        QuestionAnswer expression3 = new QuestionAnswer("Good evening", "Dobry wieczór");
	        QuestionAnswer expression4 = new QuestionAnswer("Good night", "Dobranoc");
	        QuestionAnswer expression5 = new QuestionAnswer("Goodbye", "Do widzenia");
	        QuestionAnswer expression6 = new QuestionAnswer("Hello", "Cześć");
	        QuestionAnswer expression7 = new QuestionAnswer("Nice to meet you", "Miło cię poznać");
	        QuestionAnswer expression8 = new QuestionAnswer("See you", "Na razie");
	        greetingsList.add(expression1);
	        greetingsList.add(expression2);
	        greetingsList.add(expression3);
	        greetingsList.add(expression4);
	        greetingsList.add(expression5);
	        greetingsList.add(expression6);
	        greetingsList.add(expression7);
	        greetingsList.add(expression8);
	}
	
	public List<QuestionAnswer> getList(){
		return greetingsList;
	}
}

ShuffleAndChoose.java


import java.util.Collections;
import java.util.List;

public class ShuffleAndChoose {
	private List<QuestionAnswer> list;
	
	public ShuffleAndChoose(List importedList){
		this.list = importedList;
		Collections.shuffle(list);
	}
	
	public QuestionAnswer getFirstAndRemove(){
		QuestionAnswer first = list.get(0);
		//list.remove(first);
		return first;
	}
}
0

@dammarpol nie znam się na programowaniu pod androida. działający taki silnik możesz prościej;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

class QuestionAnswer {
	private String question;
	private String answer;

	public QuestionAnswer(String question, String answer) {
		this.question = question;
		this.answer = answer;
	}

	public String getQuestion() { return question; }
	public String getAnswer() { return answer; }
}

class QABase {
	private List<QuestionAnswer> questions = new ArrayList<QuestionAnswer>();
	private QuestionAnswer lastChosen;
	private Random random = new Random();

	public void add(String question, String answer) {
		questions.add(new QuestionAnswer(question,answer));
	}

	public String getNextQuestion() {
		lastChosen = questions.get(random.nextInt(size()));
		return lastChosen.getQuestion();
	}

	public boolean checkAnswer(String answer) {
		boolean res = lastChosen.getAnswer().equals(answer);
		if(res) questions.remove(lastChosen);
		return res;
	}

	public int size() { return questions.size(); }
	public boolean canAsk() { return (size() > 0); }
}

class Main {
	public static void main(String[] args) {
		QABase qaBase = new QABase();
		qaBase.add("Good morning","Dzień dobry");
		qaBase.add("Good afternoon","Dzień dobry");
		qaBase.add("Good evening","Dobry wieczór");

		Scanner scanner = new Scanner(System.in);
		while (qaBase.canAsk()) {
			System.out.println(qaBase.getNextQuestion());
			if(qaBase.checkAnswer(scanner.nextLine())) {
				System.out.println("Brawo!");
			}
		}
	}
}

jeżeli to coś większego to taki silnik powinieneś podzielić na znacznie więcej klas typu QuestionChooser AnswerChecker z ICheckerStrategy IChooserStrategy i porobić sobie strategie jakie chcesz typu Random FromTheBegining itd... + jakąś "baze" zajmującą się tylko przechowywaniem pytań tj add, get, remove, size() itd...

1 użytkowników online, w tym zalogowanych: 0, gości: 1