2016-12-12 3 views
1

Ich habe die anderen Fragen durchgesehen, aber keine der Antworten funktionierte für mich.RecyclerView: Kein Adapter angeschlossen; Layout in Aktivität überspringen

Der Fehler, den ich immer bin, wenn die RecyclerView aufzublasen versuchen, ist:

E/RecyclerView: Kein Adapter angebracht ist;

Layout Überspringen Dies ist ein Beispiel-Item für die Arraylist ich in mein RecyclerView aufzublasen bin versucht:

//Chord Obj: Chord(int images[], String name, Int sound) 

chords.add(new Chord(new int[]{ 
      R.drawable.do_maggiore, R.drawable.do_maggiore_alt1, R.drawable.do_maggiore_alt2, 
      R.drawable.do_maggiore_alt3, R.drawable.do_maggiore_alt4, R.drawable.do_maggiore_alt5, 
      R.drawable.do_maggiore_alt6}, Resources.getSystem().getString(R.string.c), R.raw.do_maggiore)); 

Das ist mein List_Adapter.java:

public class List_adapter extends RecyclerView.Adapter<List_adapter.MyViewHolder> { 
private ArrayList<Chord> list; 
Context c; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    private TextView name; 
    private ImageView image; 

    private MyViewHolder(View v) { 
     super(v); 
     name = (TextView) v.findViewById(R.id.name); 
     image = (ImageView) v.findViewById(R.id.chord_image); 
    } 
} 

public List_adapter(Context c, ArrayList<Chord> list) { 
    this.list = list; 
    this.c = c; 
} 

@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.list_row, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override public void onBindViewHolder(MyViewHolder holder, int pos) { 
    Chord chord = list.get(pos); 
    holder.name.setText(chord.getName()); 
    holder.image.setImageResource(chord.getImages()[0]); 
} 

@Override public int getItemCount() {return list.size();} 
} 

Dies ist, wo ich die Liste und aufblasen in meine Main_Activity.onCreate():

/* gets the list */ 
    chords = new ArrayList<>(); 
    ChordsList list = new ChordsList(); 
    list.createList(); 
    chords = list.getList(); 

    /* puts the list into the recyclerView */ 
    recyclerView = (RecyclerView) findViewById(R.id.chords_recycler); 
    recyclerView.setLayoutManager(new LinearLayoutManager(Main_list_activity.this, 
      LinearLayoutManager.VERTICAL, false)); 
    recyclerView.setHasFixedSize(true); 

    final List_adapter adapter = new List_adapter(this, chords); 
    recyclerView.setAdapter(adapter); 

und schließlich ist das mein xml:

... 
<android.support.v7.widget.RecyclerView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/chords_recycler" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="25dp" /> 
... 

Das ist, was ich bisher versucht habe:

  • überprüft, ob RecyclerView irgendwie versteckt geschrumpft wurde. Es ist nicht.
  • Mehrere Elemente aus meiner Liste hinzugefügt und entfernt. Nichts hat sich geändert.
  • Es wurde versucht, den Recycler zuerst auf einen leeren Adapter zu setzen. auch kein Glück.
  • debuggte und überprüft, ob die Liste im aufgeblasenen Zustand null war. Es ist nicht.

Ich weiß nicht wirklich, was ich sonst noch tun könnte. Ich würde mich über Hilfe freuen.

EDIT:

Ich weiß nicht wirklich, ob es hilfreich, aber ich die Navigationsleiste Preset verwendet, wenn mein Projekt zu schaffen und ich hinzufüge, diesen Code in einer Klasse I erstellt und stellen Sie das Layout R.layout.content_drawer.

Darüber hinaus beim Debuggen Ich habe kein Ergebnis aus dem Debugger erhalten hier ein Bild:

debug_image

Antwort

0

ich es geschafft haben, es zu beheben. Das Problem war eigentlich offensichtlich, aber ich habe es beim Schreiben der Frage nicht vollständig verstanden.

Ich habe einfach eine andere Aktivität erstellt und das Layout als content_drawer festgelegt. Das ist falsch, weil der gesamte Code in die Drawer.class (wenn Sie die Navigation Drawer Preset in Android Studio verwenden) eingefügt werden muss.

Deshalb hat der Debugger nichts gezeigt, weil er nie in diese Klasse kam. Und weil dieser Code nie ausgeführt wurde, konnte er natürlich nichts anzeigen.

Danke für die Antworten, die ich bekam.

1

Versuchen Sie, Ihre RecyclerView Höhe „match_parent“ zu machen und dann die Ausgabe sehen ob es funktioniert oder nicht.

+0

Danke für die Antwort. Ich habe das schon ausprobiert, aber hatte kein Glück – Daniele

+0

können Sie bitte überprüfen, dass die Recyclerview nicht mit der Scrollview ist. –

1

Verwendung Folgendes, wenn Sie setzen Adapter: -

List_adapter adapter = new List_adapter(this, chords); 
RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(getActivity()); 
recyclerView.setLayoutManager(mLayoutManager1); 
recyclerView.setItemAnimator(new DefaultItemAnimator()); 
recyclerView.setAdapter(adapter); 

statt

final List_adapter adapter = new List_adapter(this, chords); 
recyclerView.setAdapter(adapter); 
+0

Danke für die Antwort, aber diese hat nicht funktioniert – Daniele

+0

können Sie sicherstellen, dass Sie richtige Daten in Array-Liste hinzufügen, wie Sie in den Adapter setzen möchten .. –

+0

Was meinst du? Sie können den obigen Code sehen. Für mich sieht es gut aus, das Chord-Objekt hat ein Array von Bildern, einen Namenstring und eine Audiodatei. Und das ist alles, was ich in der Chord-Modell-Klasse definiert – Daniele

1

Es zeigt nicht, weil Sie die RecyclerView innerhalb onCreate Methode aufzublasen versuchen.Bitte verschieben Sie Ihren RecyclerView-Code auf onResume Methode Ihrer Aktivität.

/* gets the list */ 
    chords = new ArrayList<>(); 
    ChordsList list = new ChordsList(); 
    list.createList(); 
    chords = list.getList(); 

    /* puts the list into the recyclerView */ 
    recyclerView = (RecyclerView) findViewById(R.id.chords_recycler); 
    recyclerView.setLayoutManager(new LinearLayoutManager(Main_list_activity.this, 
      LinearLayoutManager.VERTICAL, false)); 
    recyclerView.setHasFixedSize(true); 

    final List_adapter adapter = new List_adapter(this, chords); 
    recyclerView.setAdapter(adapter); 
+0

Danke, ich habe es versucht. Auch wenn ich den Code in onResume() die Liste nicht – Daniele

1

Fügen Sie folgenden in Ihrer Aktivität:

public class TestActivity extends AppCompatActivity { 
    RecyclerView recyclerView; 
ArrayList<Chord> chords; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     recyclerView = (RecyclerView)findViewById(R.id.recyclerView); 
     setAdapter(); 
    } 
private void setAdapter() { 
    chords = new ArrayList<>(); 

    chords.add(new Chord(new int[]{ 
      R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, 
      R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, 
      R.mipmap.ic_launcher},"Name", R.raw.audio_in_raw)); 


    List_adapter adapter = new List_adapter(chords, this); 
    RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(mLayoutManager1); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(adapter); 

} 

add in Ihrem Adapter folgende:

public class List_adapter extends RecyclerView.Adapter<List_adapter.MyViewHolder> { 

private List<Chord> chord; 
Context context; 
public class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView tvText; 
    ImageView ivImage; 
    public MyViewHolder(View view) { 
     super(view); 
     ivImage= (ImageView) view.findViewById(R.id.ivImage); 

     tvText= (TextView) view.findViewById(R.id.tvText); 
    } 
} 


public List_adapter(List<Chord> chord, Context context) { 
    this.chord = chord; 
    this.context = context; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.customadapter_chords, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 


    holder.tvText.setText(chord.get(position).getName()); 
    holder.ivImage.setImageResource(chord.get(position).getImages()[0]); 

} 

@Override 
public int getItemCount() { 
    return chord.size(); 
} 

}

und fügen Adapter folgendes: -

public class Chord { 
int images[]; 
String name; 
int sound; 

public Chord(int[] images, String name, int sound) { 
    this.images = images; 
    this.name = name; 
    this.sound = sound; 

} 

public int[] getImages() { 
    return images; 
} 

public void setImages(int[] images) { 
    this.images = images; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getSound() { 
    return sound; 
} 

public void setSound(int sound) { 
    this.sound = sound; 
} 
} 

und xml ist

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="70dp" 
android:weightSum="10" 

> 
<ImageView 
    android:layout_weight="2" 
    android:id="@+id/ivImage" 
    android:layout_width="0dp" 
    android:layout_height="match_parent"></ImageView> 

<TextView 
    android:gravity="center" 
    android:id="@+id/tvText" 
    android:layout_weight="6" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" /> 

+0

anzeigen, wenn Sie immer noch ein Problem haben, dann lassen Sie mich –

+0

noch einmal für den Hilfe-Mann wissen. im Grunde ist es das XML, das sich geändert hat. Eigentlich habe ich eine row.xml, die aussieht wie die, die Sie geschrieben haben, und hier setzt der Adapter die Bilder und Zeichenfolgen ein und diese Zeile wird in den Recycler eingefügt. Bitte werfen Sie einen Blick auf die bearbeitete Frage Haben Sie eine Idee warum der Debugger leer ist? – Daniele

+0

es gibt kleine Änderungen in Adapter und Modell Klassen auch ..... Sie können kopieren und fügen Sie in Ihrem Code .. dann werden Sie den Unterschied bekommen –

Verwandte Themen