Fragment support.v4 VS DB Volley ListView

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 27

27.01.2016, 17:48:33 via Website

Bei der Entwicklung meiner app stoße ich auf hoffentlich mein vorletztes Problem, Db Inhalte für eine ListView in einem Fragment anzeigen zu lassen.
da ich schon am Anfang damit Probleme hatte, habe ich erstmal versucht die app ohne Fragmente zugestallten.
Jetzt habe ich mich dazu entschieden aus Platzmangel und Design gründen es doch mit Fragmenten anzugehen.
die gesamte app soll generell über verschiedene DatenBanken seine Informationen bekommen.
in der app werden die activitys über die toolbar gewechselt, welche dann ein tabmenu haben und die tabs die Fragmente enthalten mit einem ListView von einer DB.
Das ist das aktuelle Problem.
später soll der User mit den Inhalten der ListView interagieren können so der plan, was wahrscheinlich dann das größte Problem sein wird.
aber bis dahin muss ich erstmal das mit den Fragmenten hin bekommen.
seit tagen versuche ich über google eine Lösung zu finden und stoße größtenteils auf für mich unverständliches, zu altes oder anderen kauderwelsch.
ich hoffe das mir hier vielleicht der eine oder andere wie zuvor helfen kann oder ein tip, tut oder sonstiges hat was mir weiter helfen kann. Vielen Dank
ich lass die ViewPager.class der Tabs und co raus und poste erstmal nur MainActivity und Fragment. sollte jemand andere Dateien anfragen werde ich diese anfrage editieren und hinten mit einfügen. damit es nicht allzu groß wird.

beim Fragment ist mir bewusst das protected void onCreate(Bundle savedInstanceState) nicht funktioniert.
ich habe die Variante über ein tut aus dem Internet und hatte gehofft mit der Fehlerausgabe und google es anzupassen.
meine Hoffnung war, das da es viele gibt die was ähnliches umsetzten wollen, ich einfacher zu einer Lösung komme. LEider habe ich nix verwendbares gefunden um einen Db Inhalt in einem fragment anzeigen zu lassen.
Ich hoffe das hier nicht alle mit den Augen rollen g.
beschäftige mich erst seit ende Dezember mit der app Programierung.

Vielen Dank schon mal.
MainActivity:

public class MainActivity extends AppCompatActivity {

private SQLiteHandler db;
private SessionManager session;
private Button miProfile;

Toolbar toolbar;
ViewPager viewpager;
TabLayout tablayout;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}
public void onComposeAction(MenuItem mi){        
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menuHome:

            return true;
        case R.id.menuAngebote:
            Intent intentAngebot = new Intent(MainActivity.this, AngeboteActivity.class);
            startActivity(intentAngebot);

            return true;
        case R.id.menuPAngebote:
            Intent intentPAngebot = new Intent(MainActivity.this, PAngebotActivity.class);
            startActivity(intentPAngebot);

            return true;
        case R.id.menuVerlauf:
            Intent intentVerlauf = new Intent(MainActivity.this, VerlaufActivity.class);
            startActivity(intentVerlauf);


            return true;
        case R.id.menuProfil:
            Intent intentProfil = new Intent(MainActivity.this, ProfilActivity.class);
            startActivity(intentProfil);
            return true;
    }
    return onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

//Tab Menu
viewpager = (ViewPager) findViewById(R.id.viewpager);
ViewPagerMain viewpagermain = new ViewPagerMain(getSupportFragmentManager());
viewpager.setAdapter(viewpagermain);

    tablayout = (TabLayout) findViewById(R.id.tablayout);
    tablayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tablayout.setupWithViewPager(viewpager);
    tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewpager.setCurrentItem(tab.getPosition());
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

}

fragment classe Main_News.java:

public class Main_News extends Fragment implements RecyclerView.OnScrollChangeListener{

View contentViewMainNews;

private List<News> listNews;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

private RequestQueue requestQueue;

private int requestCount = 1;

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

    recyclerView = (RecyclerView) /*getView().*/findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    listNews = new ArrayList<>();
    requestQueue = Volley.newRequestQueue(this);
    getData();

    recyclerView.setOnScrollChangeListener(this);

    adapter = new CardAdapter(listNews, this);

    recyclerView.setAdapter(adapter);
}
private JsonArrayRequest getDataFromServer(int requestCount) {
    final ProgressBar progressBar = (ProgressBar) /*getView().*/findViewById(R.id.progressBar1);

    progressBar.setVisibility(View.VISIBLE);
    setProgressBarIndeterminateVisibility(true);

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL + String.valueOf(requestCount),
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    parseData(response);
                    progressBar.setVisibility(View.GONE);
                }},
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(Main_News.this, "No More Items Available", Toast.LENGTH_SHORT).show();
                }
            });
    return jsonArrayRequest;
}
private void getData() {
    requestQueue.add(getDataFromServer(requestCount));
    requestCount++;
}
private void parseData(JSONArray array) {
    for (int i = 0; i < array.length(); i++) {
        News news = new News();
        JSONObject json = null;
        try {
            json = array.getJSONObject(i);

            news.setImageUrl(json.getString(Config.TAG_IMAGE_URL));
            news.setDatum(json.getString(Config.TAG_DATUM));
            news.setNews(json.getString(Config.TAG_NEWS));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        listNews.add(news);
    }
    adapter.notifyDataSetChanged();
}

private boolean isLastItemDisplaying(RecyclerView recyclerView) {
    if (recyclerView.getAdapter().getItemCount() != 0) {
        int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
            return true;
    }
    return false;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    contentViewMainNews = inflater.inflate(R.layout.fragment_main_news, null);
    return contentViewMainNews;
}
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    if (isLastItemDisplaying(recyclerView)) {
        getData();
    }
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

}

image

image

— geändert am 27.01.2016, 18:08:31

Antworten
  • Forum-Beiträge: 27

27.01.2016, 17:52:35 via Website

mein Gedanke ist das man vielleicht die daten über die Activity holt und dann in das fragment übergibt nur leider habe ich dazu nix gefunden.

— geändert am 27.01.2016, 17:53:03

Antworten
  • Forum-Beiträge: 27

27.01.2016, 19:00:30 via Website

in der main / also diesem fragment sollen nur inhalte angezeigt werden von einer Datenbank.
später in anderen activitys soll man die Inhalte annehmen können so das die info der Annahme der Person zu mir ankommt.
:D so sieht der plan aus :-/

Antworten
  • Forum-Beiträge: 27

27.01.2016, 19:29:56 via Website

theoretisch müsste ich bestimmt den Inhalt der gerade im fragment ist in die MainActivity bringen um dann mit mit dem fragment drauf zu zugreifen.
aber bin mir nicht sicher vor allem wenn ich pro activity mehrere fragmente benutze

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

27.01.2016, 23:16:08 via App

Ich verstehe nicht was du damit sagen willst.
Bitte mal eswas präziser

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 27

28.01.2016, 00:00:41 via Website

also ich habe es jetzt so versucht
nur mittlerweile verliere ich den überblick und funktionieren tut es auch nicht.

public class Main_News extends Fragment{

View contentViewMainNews;

private List<News> listNews;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

private RequestQueue requestQueue;

private int requestCount = 1;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View rootView = inflater.inflate(R.layout.fragment_main_news, container, false);
    /*@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main_news);*/

    recyclerView = (RecyclerView) /*getView().*/rootView.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    listNews = new ArrayList<>();
    requestQueue = Volley.newRequestQueue(getActivity());
    getData();

    recyclerView.addOnScrollListener(rVOnScrollListener);

    adapter = new CardAdapter(listNews, getActivity());

    recyclerView.setAdapter(adapter);

    return rootView;

}
private JsonArrayRequest getDataFromServer(int requestCount) {
    final ProgressBar progressBar = (ProgressBar) getActivity().findViewById(R.id.progressBar1);

    progressBar.setVisibility(View.VISIBLE);
    getActivity().setProgressBarIndeterminateVisibility(true);

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL + String.valueOf(requestCount),
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    parseData(response);
                    progressBar.setVisibility(View.GONE);
                }},
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                   /* Toast.makeText(Main_News., "No More Items Available", Toast.LENGTH_SHORT).show();*/
                }
            });
    return jsonArrayRequest;
}
private void getData() {
    requestQueue.add(getDataFromServer(requestCount));
    requestCount++;
}
private void parseData(JSONArray array) {
    for (int i = 0; i < array.length(); i++) {
        News news = new News();
        JSONObject json = null;
        try {
            json = array.getJSONObject(i);

            news.setImageUrl(json.getString(Config.TAG_IMAGE_URL));
            news.setDatum(json.getString(Config.TAG_DATUM));
            news.setNews(json.getString(Config.TAG_NEWS));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        listNews.add(news);
    }
    adapter.notifyDataSetChanged();
}

private boolean isLastItemDisplaying(RecyclerView recyclerView) {
    if (recyclerView.getAdapter().getItemCount() != 0) {
        int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
            return true;
    }
    return false;
}
private RecyclerView.OnScrollListener rVOnScrollListener = new RecyclerView.OnScrollListener(){
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView,
                                     int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (isLastItemDisplaying(myRecyclerView)) {

//Calling the method getdata again
getData();
}

    }
};

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

}

Antworten
  • Forum-Beiträge: 27

28.01.2016, 00:02:49 via Website

werde das erstmal wegschieben und was neues suchen.
vielleicht kennt ja jemand ein Tutorial welches mir ermöglicht,
ein Fragment mit einem Listview zu erstellen was die Daten von einem Server bekommt.

vielen dank

— geändert am 28.01.2016, 00:10:40

Antworten

Empfohlene Artikel