TypedArray-Resource wird falsch geladen

MARJAVA

Aktives Mitglied
Hallo zusammen,

beim Programmieren einer Android App bin ich auf ein Problem gestoßen, dass ich noch nicht lösen konnte.
Ich habe Bilder in einem TypedArray als Resource abgespeichert. Doch beim Laden der Ressource in einem Listview läd er die Bilder teilweise in einer falschen Reihenfolge. Beim Loggen der Ressourceid scheint alles zu laufen, doch die angezeigten Bilder sind falsch geladen. Hat jemand eine Idee?
Java:
public class MainActivity extends AppCompatActivity {

    public ListView listView;
    public List<RowItem> rowItems=new ArrayList<RowItem>();
    public String[] categorie;
    private TypedArray profile_pics;

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


        categorie=getResources().getStringArray(R.array.tmdb);
        profile_pics=getResources().obtainTypedArray(R.array.profile_pics);
        for (int i=0; i<categorie.length; i++){
            Log.i("i=", String.valueOf(profile_pics.getResourceId(i,-1)));
            RowItem item= new RowItem(categorie[i],profile_pics.getResourceId(i,-1));
            rowItems.add(item);

        }
        listView=findViewById(R.id.listview);
        ListAdapter adapter=new ListAdapter(this,rowItems);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                intent.putExtra("categorie",i);
                startActivity(intent);
            }
        });
    }
}
 
Meine Klasse Listadapter
Java:
package de.markusc.tmdbfilms;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class ListAdapter extends BaseAdapter {

    Context context;
    List<RowItem> rowItems;


    ListAdapter(Context context, List<RowItem> rowItems){
        this.context=context;
        this.rowItems=rowItems;

    }
    @Override
    public int getCount(){
        return rowItems.size();
    }
    @Override
    public Object getItem(int position){
        return rowItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return rowItems.indexOf((getItem(position)));
    }



    private class ViewHolder{
        ImageView profile_pic;
        TextView categorie;


    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder=null;

        LayoutInflater myInflater= (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if(convertView==null){
            convertView=myInflater.inflate(R.layout.list_item,null);
            viewHolder=new ViewHolder();
            viewHolder.categorie=(TextView) convertView.findViewById(R.id.categorie);
            viewHolder.profile_pic=(ImageView) convertView.findViewById(R.id.profile_pics);

            RowItem row_pos=rowItems.get(position);

            viewHolder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
            viewHolder.categorie.setText(row_pos.getCategorie());
            convertView.setTag(viewHolder);


        }else{
            viewHolder=(ViewHolder) convertView.getTag();
        }


        return convertView;
    }
}

meine Klasse RowItem
Java:
package de.markusc.tmdbfilms;

public class RowItem {

    private String categorie;
    private int profile_pic_id;
    public RowItem(String categorie, int profile_pic_id){
        this.categorie=categorie;
        this.profile_pic_id=profile_pic_id;
    }

    public String getCategorie(){
        return categorie;
    }

    public int getProfile_pic_id() {
        return profile_pic_id;
    }

    public void setCategorie(String categorie) {
        this.categorie = categorie;
    }

    public void setProfile_pic_id(int profile_pic_id) {
        this.profile_pic_id = profile_pic_id;
    }
}
 
So richtig nachvollziehen / reproduzieren kann ich das Verhalten nicht. Wenn ich dein Code so übernehme mit einem Test-Array funktioniert es wunderbar.
Schick vielleicht noch mal dein TypedArray und welche Android-Version du benutzt. Dann versuch ich es mal zu reproduzieren.
 
Meine Minimum API ist 23 und die Ziel Api ist 27.

Was mir aufgefallen ist, dass im Listadapter beim Auswählen der Listkomponente Nummer 4 die Variable position mit Nummer 2 angezeigt wird. Daraus resultiert, dass es nicht mehr Komponenten als 3 gibt und auch nicht mehr ausgewählt werden.
 
Hat etwas gedauert, aber ich habe den Fehler gefunden. Er lag in der getView-Methode meines ListAdapters. Die 3 Zeilen unter der If-Schleife habe ich aus ihr herausgenommen. So funktioniert es.
Java:
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder=null;
        Log.i("log position",String.valueOf(position));
        LayoutInflater myInflater= (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if(convertView==null){
            convertView=myInflater.inflate(R.layout.list_item,null);
            viewHolder=new ViewHolder();
            viewHolder.categorie=(TextView) convertView.findViewById(R.id.categorie);
            viewHolder.profile_pic=(ImageView) convertView.findViewById(R.id.profile_pics);




            convertView.setTag(viewHolder);


        }else{
            viewHolder=(ViewHolder) convertView.getTag();
        }
[COLOR=#ff0000]        RowItem row_pos=rowItems.get(position);
 
        viewHolder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
 
        viewHolder.categorie.setText(row_pos.getCategorie());[/COLOR]

        return convertView;
    }
 

Zurück
Oben