4 Stimmen

Dynamisches Hinzufügen von Layout in die GetView-Methode des Adapters in Android

Ich möchte in jeder Zeile der Listenansicht N ImageViews anzeigen. Die Anzahl der ImageViews hängt vom Wert des JSON-Parsings ab. Es kann jedes Mal 2 oder 3 oder 4 sein, wenn ich JSON vom Server abrufe.

Also kann ich kein statisches XML verwenden, indem ich inflate verwende. daher entschied ich mich, dynamische Ansicht in der getView-Methode zu erstellen und N ImageViews zur Ansicht hinzuzufügen

Ich schreibe folgenden Code, aber es zeigt immer noch nur einen ImageView und der horizontale Scroll funktioniert überhaupt nicht..

jede Hilfe wird geschätzt

public class MyAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ArrayList data;
Context con;

public MyAdapter(Context context, ArrayList data1){
// Speichert das LayoutInflater für eine schnellere Verwendung
      inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Setzt die Ereignisdaten
data= data1;
con=context;
}

public View getView(int position, View view, ViewGroup viewgroup) {
    ViewHolder holder=new ViewHolder(); //unser View-Holder der Zeile
    if (view == null) {

        HorizontalScrollView hr=new HorizontalScrollView(con);
        LinearLayout layout=new LinearLayout(con);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

           //Layout einige Eigenschaften setzen
           for(int i=1;i<2;i++)
           {
            holder.image =new ImageView(con);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100*i, 100*i);
            holder.image.setLayoutParams(layoutParams);
            layout.addView(holder.image);
           }
           //Untertitel einige Eigenschaften setzen

       //DAS LAYOUT DURCH CODE ERSTELLEN
           hr.addView(layout);

       view = hr; //STATT EINES LAYOUTS FÜR DIE ZEILE AUFZUBLASEN, BINDEN ICH ES AN DAS KÜRZLICH ERSTELLTE LAYOUT 
       //die Ansichten des Halters an die Ansichten des Layouts binden
           view.setTag(holder);
           Log.w("myapp", "neue Ansicht");
    } 
    else 
    {
       holder = (ViewHolder) view.getTag();
       Log.w("myapp", "im Reuse");
    }
        //restliche Implementierung der Ansicht
    for(int i=0;i<2;i++)
    {
    holder.image.setImageResource(R.drawable.ic_launcher);
    }
        return view;
    }

static class ViewHolder {
    ImageView image;
 TextView title;
 TextView type;
 HorizontalScrollView hr;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 4;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 1;
}
 }

6voto

Aarun Punkte 1002

Überprüfen Sie, ob das ist, was Sie wollen, denke ich. Setzen Sie einfach zufällige Werte für jede Zeile in Bildern.

    public class MyAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private ArrayList data;
    Context con;

    public MyAdapter(Context context, ArrayList data1) {

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        data = data1;
        con = context;
    }

    public View getView(int position, View view, ViewGroup viewgroup) {
        ViewHolder holder = new ViewHolder(); // unser View Holder der Zeile
        if (view == null) {

            HorizontalScrollView hr = new HorizontalScrollView(con);
            LinearLayout layout = new LinearLayout(con);
            layout.setLayoutParams(new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ));
            for (int i = 0; i < data.size(); i++) {
                holder.image = new ImageView(con);
                layout.addView(holder.image);
                holder.image.setImageResource(R.drawable.ic_launcher);
            }
            hr.addView(layout);
            view = hr;

            view.setTag(holder);

        }
        holder = (ViewHolder) view.getTag();

        return view;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 1;
    }
}

class ViewHolder {
    ImageView image;
    TextView title;
    TextView type;
    HorizontalScrollView hr;
}

2voto

WarrenFaith Punkte 56919
for(int i=1;i<2;i++)

dies bedeutet, dass es nur einmal ausgeführt wird, für i = 1, weil im nächsten Durchlauf i == 2 ist und daher i < 2 false ist.

0voto

Jose L Ugia Punkte 5822

Auf die gleiche Weise, wie Sie Ansichtselemente aus Ihrem XML-Layout aufblasen, können Sie diese wie gewohnt programmatisch erstellen. Sie müssen nur sicherstellen, dass Sie die Layoutparameter angeben und sie dem Layout hinzufügen, damit sie sichtbar sind:

Zum Beispiel nehmen Sie die Ansichten, die bei der Initialisierung Ihres ViewHolders verknüpft sind:

// Das ist eine Ansicht aus dem XML
EditText editText = (EditText) view.findViewById(R.id.YOUR_EditText1);

Ebenso, wenn Sie Ihre Ansichten dynamisch zu Ihrem Layout hinzufügen möchten, im getView() Methode:

ImageView image1 = new ImageView();
...
...
view.addView(image1);

Weitere Informationen zum Hinzufügen von Ansichten programmatisch finden Sie unter Android: Zwei Textansichten programmatisch hinzufügen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X