Android odświeżanie ListView w klasie Fragment

Android odświeżanie ListView w klasie Fragment
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

Witam,
mam problem otóż nie wiem jak sobie poradzić z problemem odświeżania fragmentów w androidzie. Tworzę aplikację która w domysle pobiera co 30 sekund dane z internetu i chciałem je umieszczać w ListView na jednym z Fragmentów, problem w tym że stworzyłem sobie Thread który się tym zajmuję i sprawdziłem i te wartości faktycznie są pobierane i przechowywane w odpowiednim miejscu nie zmienia się nic na ekranie. Wartości nadal zostają stare, chyba że przejdę dwie zakładki dalej(dwa taby dalej) i wrócę to wtedy wartości są zaktualizowane, czy orientuje się ktoś jak to działa i jak sobie z tym poradzić?

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0
Kopiuj
adapter.notifyDataSetChanged();
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

w którym miejscu tego użyć?

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0

w 150 linijce Twojego kodu ;]

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

podbijam, czytałem troche o tym o czym napisałeś ale nadal nie wiem jak tego użyć.

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0

To może pokażesz z łaski swojej trochę kodu...

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

MainActivity

Kopiuj
private TabHost tabHost;
private ViewPager viewPager;
public MyFragmentPagerAdapter myViewPagerAdapter;

	class FakeContent implements TabContentFactory {
		private final Context mContext;

		public FakeContent(Context context) {
			mContext = context;
		}

		@Override
		public View createTabContent(String tag) {
			View v = new View(mContext);
			v.setMinimumHeight(0);
			v.setMinimumWidth(0);
			return v;
		}
	}

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.tabs_viewpager_layout);

		pobieranie_wartosci.start();
	//this starts Thread for updating data	

	        		
	     		
		
		// init tabhost
		this.initializeTabHost(savedInstanceState);

		// init ViewPager
		this.initializeViewPager();

	}
	

	
	

	private void initializeViewPager() {
		List<Fragment> fragments = new Vector<Fragment>();

		fragments.add(new Tab1Fragment());
		fragments.add(new Tab2Fragment());
		fragments.add(new Tab1Fragment());
		fragments.add(new Tab1Fragment());
		fragments.add(new Tab3Fragment());
		fragments.add(new Tab1Fragment());


		this.myViewPagerAdapter = new MyFragmentPagerAdapter(
				getSupportFragmentManager(), fragments);
		this.viewPager = (ViewPager) super.findViewById(R.id.viewPager);
		this.viewPager.setAdapter(this.myViewPagerAdapter);
		this.viewPager.setOnPageChangeListener(this);

		onRestart();

	@Override
	public void onTabChanged(String tabId) {
		int pos = this.tabHost.getCurrentTab();
		this.viewPager.setCurrentItem(pos);

		HorizontalScrollView hScrollView = (HorizontalScrollView) findViewById(R.id.hScrollView);
		View tabView = tabHost.getCurrentTabView();
		int scrollPos = tabView.getLeft()
				- (hScrollView.getWidth() - tabView.getWidth()) / 2;
		hScrollView.smoothScrollTo(scrollPos, 0);

	}

	@Override
	public void onPageScrollStateChanged(int arg0) {
	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
	}

	@Override
	public void onPageSelected(int position) {
		this.tabHost.setCurrentTab(position);
	}
	


	}


 

i teraz wątek który domyślnie miał aktualizować dane:

Kopiuj
Thread pobieranie_wartosci = new Thread()
{
	public void run()
	{
		while(true)
		{
			
			int r = zmienne.lista_moich_spolek.size()-1;
			for(int i =0; i<=r;i++){
				try 
				{
					zmienne.lista_moich_spolek.get(i).transformacja_ceny(new Cena().execute(zmienne.lista_moich_spolek.get(i).numer).get());
				} catch (InterruptedException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ExecutionException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				

				zmienne.lista_moich_spolek.get(0).cena_kupna++;
				myViewPagerAdapter.notifyDataSetChanged();
				System.out.println("cena :" + zmienne.lista_moich_spolek.get(0).cena_kupna);
			}
			
		try {
			Thread.sleep(1500);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		}
	}
	
};

FragmentPageAdapter

Kopiuj

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

	List<Fragment> fragments;

	public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
		super(fm);
		this.fragments = fragments;
	}

	@Override
	public Fragment getItem(int position) {
		return this.fragments.get(position);
	}

	@Override
	public int getCount() {
		
		return fragments.size();
	}

}


Fragment

Kopiuj


public class Tab2Fragment extends Fragment {


	private ArrayList<HashMap<String, String>> list;

	public static final String FIRST_COLUMN="First";
	public static final String SECOND_COLUMN="Second";
	public static final String THIRD_COLUMN="Third";
	public static final String FOURTH_COLUMN="Fourth";
	
	@Override
	public View onCreateView(LayoutInflater inflater,
			@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.spolki_portfel, container, false);


	    	final ListView listView=(ListView) v.findViewById(R.id.listView1);
	    	list=new ArrayList<HashMap<String,String>>();
	    	LayoutInflater inflater1 = getActivity().getLayoutInflater();
	    	View header = inflater1.inflate(R.layout.naglowek_wlasne_spolki, listView, false);
	    	listView.addHeaderView(header);
	    	

	    			
			ListViewAdapter adapter=new ListViewAdapter(getActivity(), list);
			listView.setAdapter(adapter);
			
		
	
		return v;
	}
	}

Postarałem się powycinać jak najwięcej treści żeby zostawić sam szkielet, jeśli coś jeszcze potrzeba to prosze pisać. Tab2Fragment zawiera ListView którą chciałbym aktualizować co 30 sekund, a wątek który domyslnie miał odświeżać znajduje się w MainActivity

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0

W Tab2Fragment Twój adapter nazywa się adapter. Więc i w wątku musisz skorzystać z adapter a nie z myViewPagerAdapter.

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0
Kopiuj
zmienne.lista_moich_spolek.get(i).transformacja_ceny(new Cena().execute(zmienne.lista_moich_spolek.get(i).numer).get());

Mistrzostwo świata. Wołam @Koziołek @niezdecydowany LINCZUJCIE!

Zobacz pozostałe 5 komentarzy
panryz
haha wtedy to jest leniwe a nie niepełne :P
panryz
8 kropek :D a Ty @Koziołek o dwóch pisałeś :D
Koziołek
Tu nie chodzi już o ilość kropek.
panryz
To już swoją drogą :P
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

czyli mam przenieść wątek do Tab2Fragment aby się móc dostać do adaptera?

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0

@Picrors jest to jakieś wyjście. Generalnie powinieneś wysłać komunikat żeby zrobić update view. Masz masakrę w kodzie, ale idąc na łatwiznę odpowiedź na Twoje pytanie to tak. Zastanawia mnie jedno. Wiedziałeś żeby użyć tego do myViewPagerAdapter ale nie wpadłeś na to żeby dołożyć to do adapter? Coś mi się wydaje że bezmyślne kopiowanie poszło w ruch.

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Pozwolę sobie przejechać się tylko po tym nieszczęsnym wątku. po pierwsze w androidzie istnieje ScheduledExecutorService (http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html), który wykona za ciebie jakieś 80% pracy związanej z tym wątkiem.

Po drugie pętla. Jak rozumiem lista_moich_spolek ma typ z drzewa Collection. Zamiast zwykłego for-a należy zatem użyć foreach ALBO while z iteratorem. Rozwiązanie w obecnej formie jest w miarę poprawne wydajnościowo tylko w przypadku gdy masz pod spodem kolekcję o stałym czasie dostępu np. ArrayList. Poza tym czytelność leży.
Zastanawia mnie tu też klasa Cena, której nazwa wskazuje raczej na obiekt domenowy o dość ograniczonym zakresie obowiązków... suddenly pineapples... znaczy się metoda execute. Jak już to opakuj ją w jakąś nazwę, która coś znaczy.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

tak, lista_moich_spolek jest ArrayListem. Jeśli chodzi o cenę jest to AsyncTask który parsuje i pobiera wartości indeksów spółek z sieci. Niestety literatura w języku polskim nie mówi wiele na ten temat więc nie wiem jak użyć narzędzi jak np. ScheduledExecutorService. Niestety przeniesienie wątku do Tab2Fragment też nie wiele pomogło.

Koziołek
Niestety literatura w języku polskim, nie lubię tego mówić, ale najpierw podszkól angielski.
panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0

To ja jeszcze pozwolę sobie dołożyć 3 grosze do tego co napisał @Koziołek.

ScheduledExecutorService jak najbardziej. Problem polega na tym że on chce z tego wątku robić ViewUpdate. Niestety, jeśli nie oprze tego o Handler to tego z innego wątku nie wykona, bo one nie mają dostępu do UIThread. Idąc tym tropem dalej, to może od razu użyłby dedykowanego rozwiązania do tego jakim jest AsyncTask lub RxJava. Oba te narzędzia tworzą nowy wątek przy okazji mając dostęp do UIThread, więc cała komunikacja między wątkimi odpada, co w przypadku tego "kodu" jest nawet wskazane.

niezdecydowany
niezdecydowany
rxJava nie robi z automatu nowego wątku - musisz jej powiedzieć że ma być async.
panryz
Ok to prawda. Użyłem zbyt dużego skrótu myślowego
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

W takim razie jakiego narzędzia powinienem spróbować użyć?

panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
0
Picrors napisał(a):

W takim razie jakiego narzędzia powinienem spróbować użyć?

Myślę, że całkiem niezłym zestawem może okazać się:

  1. Głowa
  2. Internet
  3. Wszystkie informacje, które zostały w tym wątku napisane
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)