ScrollView & ListView problem - gelöst

N

Nonsens

Gast
Hallo alle,

ich hab ein Problem mit ScrollView.

scrollview.fullScroll(ScrollView.FOCUS_DOWN);

Dies funktioniert aber leider bleibt die letzte Zeile unsichtbar und muss per Hand noch nach gescrollt werden.

Weiß Jemand eine Lösung?

Grüße
 
Einfach einen Leereintrag hinzufügen , oder dem Inhalt des Containers ein Margin Bottom vergeben
 
swa00 schrieb:
Einfach einen Leereintrag hinzufügen , oder dem Inhalt des Containers ein Margin Bottom vergeben

Leer Zeile geht nicht, und MarginBottom, auf die Idee bin ich nicht gekommen, danke :)
 
Hallo alle,

ich habe die TextView durch einen ListView ersetzt. Zu Anfang hat es auch mit festen Werten gut funktioniert. Da ich aber zur Laufzeit Werte hinzufügen will hab ich das String[] durch eine ArrayList ersetzt. Bei mehrfacher Verwendung von adapter.add("+"); wird jedoch nur der 1. Aufruf angezeigt. Interessant ist auch dass der index i in getView(int i, View view, ViewGroup parent) immer 0 ist.

Ich hab den Code mit Internet Beispielen verglichen, ich kann keinen Fehler finden :confused2:

ich komm da einfach nicht weiter :sad:

Vielleicht ist der Fehler auch in der XML Datei

Code:
<ScrollView
            android:layout_width="match_parent"
            android:layout_alignParentLeft="false"
            android:layout_alignParentStart="false"
            android:layout_below="@+id/textViewM"
            android:layout_height="match_parent"
            android:fadingEdge="none"
            android:layout_above="@+id/Panel"
            android:id="@+id/ScrollViewHistory">

            <ListView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/History" />
        </ScrollView>

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id="@+id/listItem">

    <TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/value"
        android:layout_weight="1"
        android:gravity="right" />
</LinearLayout>


Code:
public class MainActivity extends AppCompatActivity {

    ScrollView scrollViewHistory;
    ListView history;
    ArrayList<String> values = new ArrayList<>();

    mAdapter adapter;

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

        scrollViewHistory = (ScrollView) findViewById(R.id.ScrollViewHistory);

        //values.add("0");

        history = (ListView) findViewById(R.id.History);

        adapter = new mAdapter(getApplicationContext(), values);

        history.setAdapter(adapter);

    }


Code:
class mAdapter extends ArrayAdapter {
    ArrayList values;
    LayoutInflater inflater;

    public mAdapter(Context context, ArrayList arr) {
        super(context, R.layout.item_value, arr);
        values = arr;

        inflater = LayoutInflater.from(getContext());
    }

    @Override
    public View getView(int i, View view, ViewGroup parent) {

        if(view != null) { return view; }

        LinearLayout item = (LinearLayout) inflater.inflate(R.layout.item_value, parent, false);
        try {

            TextView value = (TextView) item.findViewById(R.id.value);
            String text = (String)values.get(i);
            value.setText(text);
            value.setTextColor(Color.BLUE);
        }
        catch(Exception e){
            e.printStackTrace();
        }

        return item;
    }
}

Code:
public void addValue(View v){
        //values.add("+");
        adapter.add("+");
        //adapter.notifyDataSetChanged();
        history.invalidateViews();
    }
 
Hallo Nonsens,

wenn du Änderungen durchführst, kannst du den Adapter vor jeder Änderung löschen und neu füllen und dann setzen .

adapter = null;
adapter = new mAdapter(getApplicationContext(), NEWvalues);
history.setAdapter(adapter);
adapter.notifyDataSetChanged();
 
swa00 schrieb:
Hallo Nonsens,

wenn du Änderungen durchführst, kannst du den Adapter vor jeder Änderung löschen und neu füllen und dann setzen .

adapter = null;
adapter = new mAdapter(getApplicationContext(), NEWvalues);
history.setAdapter(adapter);
adapter.notifyDataSetChanged();

Hat den selben Effekt, es wird nur 1 Item angezeigt :confused2: Ich hab nun den Verdacht, dass meine XML für die ListView nicht stimmt, denn auch in der Vorschau wird nur 1 Item angezeigt. Kann es sein, dass man da noch die Max-Anzahl der Items angeben muss? :confused2:

Edit:
Hab nun einen Versuch mit 4 Vorgaben gemacht, es wird nur das 1. Item angezeigt. :mad2:

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Zuletzt bearbeitet:
Hallo alle,

als ich im Internet danach gesucht hab, dass meine ListView nur ein item anzeigt, bin ich auch fündig geworden.

Die ListView darf NICHT in einem ScrollView sein. Die ListView entspricht selbst einer ScrollView und eine ScrollView kann nur ein Object aufnehmen.

Nachdem ich nun die ScrollView entfernt und die ListView entsprechend im Layout eingebunden habe funktioniert es nun wie es soll.

adapter.add(); reicht aus um die Liste zu ergänzen. Der Aufruf von adapter.notifyDataSetChanged(); ist also nicht notwenig. :smile:

@swa00
Sorry, aber der getView Code ist richtig und funktioniert. Schau dir mal entsprechende Beispiele im Internet an :biggrin:
 
.[EDIT]
Es fand eine nachträgliche Änderung seitens des TE in seinen Postings statt
[EDIT]
.
Sorry, aber der getView Code ist richtig und funktioniert. Schau dir mal entsprechende Beispiele im Internet an
Es hatte schon seinen Grund, warum ich auf den Link verwiesen habe , denn ich orakel mal
deine nächste Frage hier im Forum - und die kommt , da bin ich mir sicher (Stichpunkt : Holder)


An der Stelle muss ich mal etwas loswerden :

Ich helfe ja gerne, aber du präsentierst bei deinen Fragestellungen teilweise nur halbe Angaben
In dem Beispiel lässt du komplett die Info weg , dass du in ein ListView in einem Scrollview nestest - warum ???

Zitat von Dir :
ich habe die TextView durch einen ListView ersetzt.
Kein Wort von Dir , wo, an welcher Stelle und warum .....
Der Leser geht davon aus , dass du nun jetzt schlichtweg ein ListView hast.


Du wirst es nicht glauben - unsere Kristallkugel ist auch nur beschränkt leistungsfähig.


Man sitzt hier ,schaut sich deine zahlreichen Fragen an , recherchiert für dich und gibt seine Erfahrungen weiter
(die sind nun mal hier offensichtlich unterschiedlich !!! )

Und du hast nichts Besseres übrig , denjenigen noch zurechtzuweisien , und er möge doch mal
im Internet recherchieren ?????

OBWOHL du wichtige Infos weglässt und nur den halben Code postest ???

Warum tust du es denn nicht zuerst selbst ???

Ehrlich gesagt , ziemlich Dreist von dir

Wenn du also in Zukunft Hilfe haben möchtest, dann schreib nicht einfach drauf los, sondern versuche erst mal das Problem
selbst zu lösen , anstatt hier die Forenteilnehmer an der Nase herum zu führen ...

Nach dem Motto : Ich schreib mal was (halbes), vielleicht ist der ja schneller als ich

Und ein Danke , respektive einen Klick auf den Knopf scheint dir auch oft fremd zu sein
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: 123thomas
Hier der fertige Code.

Code:
ListView history;
    ArrayList<String> values = new ArrayList<>();

    mAdapter adapter;

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

        history = (ListView) findViewById(R.id.History);

        adapter = new mAdapter(getApplicationContext(), values);

        history.setAdapter(adapter);
        history.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    }
Code:
public void subValue(View v){

        adapter.add("-");

        adapter.notifyDataSetChanged();

    }
    public void addValue(View v){

        adapter.add("+");

        adapter.notifyDataSetChanged();
    }
Code:
public View getView(int i, View view, ViewGroup parent) {
            LinearLayout item;

            if(view != null) { item = (LinearLayout) view; }
            else { item = (LinearLayout) inflater.inflate(R.layout.item_value, parent, false);}

            try {

                TextView value = (TextView) item.findViewById(R.id.value);
                String text = (String)values.get(i);
                value.setText(text);
                value.setTextColor(Color.BLUE);
            }
            catch(Exception e){
                e.printStackTrace();
            }

            return item;
        }
Grüße
 
Zuletzt bearbeitet von einem Moderator:
[EDIT]
Diese Antwort beruht auf einen vom TE verfassten langen Text, den er zum wiederholten Male
verändert/gelöscht hat - NACHDEM ich das Folgende geschrieben habe
[EDIT]



Na dann lieber Nonsens , solltest du dir mal Gedanken machen, ob deine Fragestellungen ausreichend und präzise sind.

Denn wie du siehst, bin ich nicht er Einzige, der das so empfindet.
Hinzu kommt noch, dass du deine Postings ständig nachträglich änderst, da kann man nicht mehr folgen


Aber dann auch noch hier mit Zurechtweisungen aufzufahren , weil mal schlichtweg ( als erfahrender Entwickler) deine Fragen
nicht versteht und vor allem Diese teilweise wirr sind - sind definitiv fehl am Platze.

Du erkennst nicht ansatzweise , dass man dir auch noch zusätzliche Informationen anhand geben möchte,
das ignorierst du völlig . (getViewHolder)

NEIN - du hast Recht, das reicht für dein Beispiel und gut ist.- Das Internet hat es so gesagt . PUNKT.

Kein Danke, kein gar nichts - lediglich seitenweise : "ach swa00, du bist so doof" :)

Nur als kleines Beispiel :

Dein getView geht, klar , kein Problem es läuft . - Es ist aber äußerst rudimentär.
Warum nimmst du denn nicht den Tip an . mal zu schauen , wie es richtig geht - kein Interesse daran ???
Und dein Entwicklungsstatus ist nun mal rudimentär, das ist nicht von der Hand zuweisen .

Du weist mich zurecht und erklärst :
adapter.add(); reicht aus um die Liste zu ergänzen. Der Aufruf von adapter.notifyDataSetChanged(); ist also nicht notwenig
Das zeigt ganz deutlich : Du hast gar nicht verstanden, wann man notify anwendet - behauptest aber dreist,
dass der Andre quatsch erzählt.


Ich werde wirklich nicht den Eindruck los , dass du sehr viel mit Copy & Paste arbeitest.

Ich hab den Code mit Internet Beispielen verglichen, ich kann keinen Fehler finden :confused2:

Das ist kein fundiertes Entwickeln , das ist Try & Hope
Und genau deshalb rennst du auch in deine vermeidlichen Sackgassen.
.

Warum bin ich dann hier?

Weil hier reale Menschen sitzen und versuchen dir zu helfen, und dass Diese
nicht das Gefühl vermittelt bekommen, sie würden veräppelt werden ???
Hast du dir mal Gedanken darum gemacht , dass man sich für Dich die Zeit nimmt und versucht für DICH eine Lösung zu finden ?

Unter den Umständen braucht man Dir in Zukunft auch nicht mehr zu helfen,du beantwortest/veränderst ja selbst deine Threads - muss das sein ??
Da hilft man lieber Anderen , die wirklich fundiert in der Sackgasse stecken .

Eines darfst du hier NICHT vergessen : - DU hast ein Entwickler-Problem , NICHT wir ..
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Kiwi++Soft
@swa00

warum bist du nur so wütend auf mich, ich hab dir doch nichts getan :confused2:
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.021
swa00
swa00
D
Antworten
9
Aufrufe
1.767
jogimuc
J
J
  • JoEntwickler
Antworten
0
Aufrufe
974
JoEntwickler
J
Zurück
Oben Unten