Tabelle mit Bildern und Button

  • Antworten:18
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 21

21.06.2015, 11:49:31 via Website

Hallo zusammen,

ich habe ein Problem mit meiner ersten App. Ich habe eine Tabelle, in deren Zeilen ich jeweils eine Spalte mit einem Bild und eine Spalte mit einem Button angelegt habe. Das klappt bis zur 21. Zeile sehr gut. Füge ich eine 22. Zeile ein wird die App beim ausführen auf dem Smartphone abgebrochen.
Woran kann das liegen?

Anbei nun noch eine Beispielzeile. Die Anderen sehen genauso aus. Beim klicken auf den Button soll eine weitere Activity gestartet werden. Das klappt soweit auch ohne Probleme.

Danke für eure Hilfe

<TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:layout_width="250dp"
                android:layout_height="110dp"
                android:id="@+id/imageView18"
                android:layout_column="0"
                android:src="@drawable/mor1" />

            <Button
                android:layout_width="110dp"
                android:layout_height="wrap_content"
                android:text="Info"
                android:id="@+id/btn_name"
                android:layout_column="1"
                android:layout_gravity="center"
                android:textAlignment="center" />
        </TableRow>
    </TableLayout>

Antworten
  • Forum-Beiträge: 1.904

21.06.2015, 13:47:02 via App

Was sagt der/die LogCat?

(Ich vermute OutOfMemory)

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
  • Forum-Beiträge: 21

21.06.2015, 13:57:56 via Website

Ja genau. "Throwing OutOfMemoryError "Failed to allocate a 8640012 byte allocation with 2545136 free bytes and 2MB until OOM"" Was kann man da machen?

Antworten
  • Forum-Beiträge: 1.904

21.06.2015, 17:33:42 via App

Die Bilder runterskalieren und die Bilder, die nicht mehr gebraucht werden, ausm Speicher schmeißen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
  • Forum-Beiträge: 21

21.06.2015, 19:02:07 via Website

Sven R.

Die Bilder runterskalieren und die Bilder, die nicht mehr gebraucht werden, ausm Speicher schmeißen.

Also hab die Bilder von im Schnitt 56 KByte auf 38 KByte herunterskaliert. Hat leider gar nichts gebracht.

Wie kann ich die nicht mehr gebrauchten Bilder denn aus dem Speicher werfen? Entschuldige, dass ich so doof/viel frage. Bin halt noch Anfänger. Hast du vielleicht ein Tutorial dazu?
Vielen Dank

Antworten
  • Forum-Beiträge: 1.904

21.06.2015, 22:16:45 via App

Äh ne. 56 kb ist super! Das ist ja winzig! 😁 Nimm mal wieder die unkomprimierten.
Dann hab ich jetzt keine Ahnung. Mit so kleinen Bildern und dann OutOfMemory habe ich keine Erfahrung. Ich könnte höchstens vermuten, dass die Bilder doppelt und dreifach geladen werden. Zeig mal den Code, in dem du die Bilder lädst. Vielleicht kann dann jemand anderes helfen.

Edit: Ach ich sehe gerade, du hast das alles statisch ins Layout eingebunden. Ich würde das ganze in eine Liste (oder vorzugsweise RecyclerView) mit nem Adapter packen. Lies dich mal ins Thema ListView/RecyclerView ein. Wäre mein einziger Vorschlag, vielleicht liege ich auch falsch.

— geändert am 21.06.2015, 22:20:43

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
  • Forum-Beiträge: 21

22.06.2015, 15:28:17 via Website

Hallo,

habe es mit einem ListView versucht, und auch hinbekommen. Wirft aber auch wieder eine OutOfMemory :-(

Beim langsamen durchscrollen geht auch wieder alles ohne Probleme. Beim schnellen scrollen stürtzt es wieder ab.

Antworten
  • Forum-Beiträge: 1.904

22.06.2015, 16:49:50 via App

Äh, keine Ahnung...

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
  • Forum-Beiträge: 11.179

23.06.2015, 17:57:44 via Website

Wie hast du das mit der ListView gemacht?
Hast du alle Bilder im Speicher behalten oder nur die die du brauchst?

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

Antworten
  • Forum-Beiträge: 21

23.06.2015, 20:54:39 via Website

Ich vermute, dass die wohl im Speicher bleiben. Wie kann ich das verhindern? Vielen Dank

import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;


public class MainActivity extends Activity{

    ListView list;
    String[] itemname ={
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7",
            "8",
            "9",
            "10",
            "11",
            "12",
            "13",
            "14",
            "15",
            "16",
            "17",
            "18",
            "19",
            "20",
            "21",
            "22",
            "23",
            "24"

    };

    Integer[] imgid={
            R.drawable.1,
            R.drawable.2,
            R.drawable.3,
            R.drawable.4,
            R.drawable.5,
            R.drawable.6,
            R.drawable.7,
            R.drawable.8,
            R.drawable.9,
            R.drawable.10,
            R.drawable.11,
            R.drawable.12,
            R.drawable.13,
            R.drawable.14,
            R.drawable.15,
            R.drawable.16,
            R.drawable.17,
            R.drawable.18,
            R.drawable.19,
            R.drawable.20,
            R.drawable.21,
            R.drawable.22,
            R.drawable.23,
            R.drawable.24    
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CustomListAdapter adapter = new CustomListAdapter(this, itemname, imgid);
        list = (ListView) findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                String Slecteditem= itemname[+position];
                Toast.makeText(getApplicationContext(), Slecteditem, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

— geändert am 23.06.2015, 20:55:07

Antworten
  • Forum-Beiträge: 11.179

23.06.2015, 21:18:17 via App

ja da übergibst du das nur da werden die Bilder nicht geladen. Zeig mal deinen ListAdapter.

und zwischenduch den GC also GarbageCollector aufrufen vlt. hilft das ja. Sonst mal Bilder rausnehmen und einzelne laden und schauen ab welcher Anzahl die Exception fliegt.

Man bedenke das Bild ist im Zusatand der Anzeige viel größer als die Bilddatei da es bei Anzeigen entpackt werden muss.

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

Antworten
  • Forum-Beiträge: 21

23.06.2015, 21:29:03 via Website

Das mit dem Garbage Collector hatte ich auch schon mal versucht. Allerdings mehr zufällig an ein paar Stellen eingefügt. Hat soweit auch nicht geholfen. Wo muss ich den GC denn aufrufen?

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomListAdapter extends ArrayAdapter<String> {

    private final Activity context;
    private final String[] itemname;
    private final Integer[] imgid;

    public CustomListAdapter(Activity context, String[] itemname, Integer[] imgid) {
        super(context, R.layout.mylist, itemname);
        this.context=context;
        this.itemname=itemname;
        this.imgid=imgid;
    }

    public View getView(int position,View view,ViewGroup parent) {

        LayoutInflater inflater=context.getLayoutInflater();
        View rowView=inflater.inflate(R.layout.mylist, null,true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        TextView extratxt = (TextView) rowView.findViewById(R.id.textView1);
        txtTitle.setText(itemname[position]);
        imageView.setImageResource(imgid[position]);
        extratxt.setText("Description " + itemname[position]);
        return rowView;

    };
}

Antworten
  • Forum-Beiträge: 1.904

24.06.2015, 07:52:36 via App

Und wenn du gerade schon auf ViewHolder umrüstest, dann kannst auch gleich das RecyclerView benutzen. Das sollte nochmal schneller sein.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
  • Forum-Beiträge: 21

27.06.2015, 12:07:27 via Website

Hallo,

danke nochmal für die Antworten. Ich hatte erst heute Zeit, mich in die Themen einzulesen. Habe noch dieses Tutorial gefunden:

daddelkiste.com/?p=345

Ich weiß jetzt allerdings absolut nicht, wie ich da meine Bilder und Texte einfügen kann.

Danke für eure Hilfe

Antworten
  • Forum-Beiträge: 11.179

27.06.2015, 12:16:04 via Website

Da ist doch alles schön anschaulich beschrieben, wo liegt dein Problem?
Du brauchst erstmal eine Klasse wo eine Daten gepeichert werden, so wie im tut die Article Klasse.
Oder da du es Per Drawables macht kannst du es direkt über die IDs machen, das ist aber dann nicht allgemein und kann schlecht für wetere Projekte verändert werden.

— geändert am 27.06.2015, 12:17:11

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

Antworten
  • Forum-Beiträge: 72

28.06.2015, 19:16:02 via Website

Ein Garbage Collection Aufruf wird in Java nicht zwingend von der JVM ausgeführt.
Die JVM entscheidet selber, ob sie ein Garbage Collection ausführt, oder nicht, so ein Durchgang erzeugt auch cpu Last, deswegen musst du den GC mehrmals, mind. 5-6 mal aufrufen, um sicher zu gehen, dass der Garbage Collector auch ausgeführt wird.
Eine RecyclerView managt das aber selbst.
Wenn du scrollst, wird diese selbst Views aus dem Speicher löschen oder hinzufügen.

Antworten
  • Forum-Beiträge: 21

14.07.2015, 20:03:45 via Website

Hallo zusammen,

nochmals Danke für die Hilfe bis hierhin. Habe jetzt alles auf Recyclerview umgebaut. Habe aber ein neues Problem :-(. Wie kann ich nun ein onClick Event erstellen. Also dass bei einem Click auf ein Bild eine neue Activity gestartet wird? Hier mal mein Adapter:

public class CountryAdapter extends RecyclerView.Adapter{

private List<Car> countries;
private int rowLayout;
private Context mContext;

public CarAdapter(List<Car> cars, int rowLayout, Context context) {
    this.cars = cars;
    this.rowLayout = rowLayout;
    this.mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    Car car = carss.get(i);
    viewHolder.carName.setText(car.name);
    viewHolder.carImage.setImageDrawable(mContext.getDrawable(car.getImageResourceId(mContext)));
}


@Override
public int getItemCount() {
    return cars == null ? 0 : cars.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView carName;
    public ImageView carImage;

    public ViewHolder(View itemView) {
        super(itemView);
        carName = (TextView) itemView.findViewById(R.id.carName);
        carImage = (ImageView)itemView.findViewById(R.id.carImage);
    }

}

}

Antworten