2016-09-23 14 views
2

So das Szenario ist, ich möchte ein Objekt zu einem RecyclerView von einem Fragment hinzufügen, die ich weiß, wie zu tun ist. Die Daten werden jedoch nicht angezeigt, wenn das Objekt hinzugefügt wird. Hier ist mein Code:Android - Meine RecyclerView-Daten werden nicht angezeigt

ListAdapter:

public class ListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

public static final int ITEM_TYPE_NOTE = 0; 
public static final int ITEM_TYPE_CATEGORY = 1; 

private Context mContext; 
private List<ObjectModel> mList; 

public ListAdapter(Context context, List<ObjectModel> list) { 
    mContext = context; 
    mList = list; 
} 

@Override 
public int getItemViewType(int position) { 
    return position % 2 * 2; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View noteView = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_list_item, parent, false); 
    View categoryView = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_list_item, parent, false); 

    switch (viewType) { 
     case ITEM_TYPE_NOTE: 
      return new NoteViewHolder(noteView); 
     case ITEM_TYPE_CATEGORY: 
      return new CategoryViewHolder(categoryView); 
    } 
    return null; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    switch (holder.getItemViewType()) { 
     case ITEM_TYPE_NOTE: 
      NoteViewHolder noteViewHolder = (NoteViewHolder) holder; 
      noteViewHolder.bindNote((Note) mList.get(position)); 
      break; 
     case ITEM_TYPE_CATEGORY: 
      CategoryViewHolder categoryViewHolder = (CategoryViewHolder) holder; 
      categoryViewHolder.bindCategory((Category) mList.get(position)); 
      break; 
    } 
} 

@Override 
public int getItemCount() { 
    return 0; 
} 

class NoteViewHolder extends RecyclerView.ViewHolder 
     implements View.OnClickListener { 

    public ImageView mNoteListItemImage; 
    public TextView mNoteListItemText; 
    public ImageView mDeleteNoteImage; 

    public NoteViewHolder(View itemView) { 
     super(itemView); 

     mNoteListItemImage = (ImageView) itemView.findViewById(R.id.NoteListItemImage); 
     mNoteListItemText = (TextView) itemView.findViewById(R.id.NoteListItemText); 
     mDeleteNoteImage = (ImageView) itemView.findViewById(R.id.DeleteNoteImage); 

     itemView.setOnClickListener(this); 
    } 

    public void bindNote(Note note) { 
     mNoteListItemText.setText(note.getTitle()); 
    } 

    @Override 
    public void onClick(View view) { 

    } 
} 

Hauptaktivität:

public class MainActivity extends AppCompatActivity { 

private ImageView mAddItemImage; 
private RecyclerView mRecyclerView; 
private Note mNote; 
private List<ObjectModel> mList = new ArrayList<>(); 

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

    mAddItemImage = (ImageView) findViewById(R.id.AddItemImage); 
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 

    mAddItemImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startNewItemActivity(); 
     } 
    }); 

    Intent intent = getIntent(); 
    mNote = (Note) intent.getSerializableExtra(getString(R.string.note)); 
    mList.add(mNote); 

    ListAdapter listAdapter = new ListAdapter(this, mList); 
    mRecyclerView.setAdapter(listAdapter); 

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(layoutManager); 

    mRecyclerView.setHasFixedSize(true); 
} 

EDIT 5 - Behinderte sofort laufen und bekam dies:

09-28 10:54:22.725 9992-9992/com.x.x E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.x.x, PID: 9992 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.x.x.items.Note.getTitle()' on a null object reference 
                    at com.x.x.adapters.ListAdapter$NoteViewHolder.bindNote(ListAdapter.java:88) 
                    at com.x.x.adapters.ListAdapter.onBindViewHolder(ListAdapter.java:56) 
                    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471) 
                    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504) 
                    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741) 
                    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
                    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
                    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
                    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
                    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
                    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
                    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906) 
                    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:508) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705) 
                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559) 
                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1468) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:508) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705) 
                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559) 
                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1468) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 
                    at android.widget.FrameLayout.onLayout(FrameLayout.java:508) 
                    at android.view.View.layout(View.java:15654) 
                    at android.view.ViewGroup.layout(ViewGroup.java:4969) 
                    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2102) 
                    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1859) 
                    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1078) 
                    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5875) 
                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
                    at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
                    at android.view.Choreographer.doFrame(Choreographer.java:550) 
                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.app.ActivityThread.main(ActivityThread.java:5351) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 

Bitte um Hilfe!

Update:

Dies ist, wie ich Informationen

In meinem Fragment meiner Listen- bin vorbei, wo Sie eine neue Notiz zu erstellen, gibt es zwei EditTexts. Die Informationen aus den EditTexts werden dann an die MainActivity übergeben.

@Override 
public void onClick(View v) { 
    if (v == mConfirmImageNN) { 
     String titleText = mNoteTitleEdit.getText().toString(); 
     String descriptionText = mNoteDescriptionEdit.getText().toString(); 

     // Display an error if both EditTexts are empty 
     if (v == mConfirmImageNN && titleText.equals("")) { 
      noteError(); 
     } else if (v == mConfirmImageNN && descriptionText.equals("")){ 
      noteError(); 
     } else { 
      // Create note otherwise 
      Note note = new Note(titleText, descriptionText); 
      goBackNote(note); 
     } 
    } 

    // Go back to MainActivity with no info 
    if (v == mCancelImageNN) { 
     goBackNone(); 
    } 
} 

// Go back to MainActivity 
private void goBackNote(Note note) { 
    Intent intent = new Intent(getActivity(), MainActivity.class); 
    intent.putExtra(getString(R.string.note), (Serializable) note); 
    startActivity(intent); 
} 

// With nothing 
private void goBackNone() { 
    Intent intent = new Intent(getActivity(), MainActivity.class); 
    startActivity(intent); 
} 

Ich erhalte die Informationen mit einem Bündel.

Bundle bundle = getIntent().getExtras(); 
mNote = (Note) bundle.getSerializable(getString(R.string.note)); 

Dann füge ich es meiner Liste hinzu.

mList.add(mNote); 

Nebenbei, so habe ich meine Liste initialisiert.

private List<ObjectModel> mList = new ArrayList<>(); 

ObjectModel.

public class ObjectModel { 
Note mNote; 
Category mCategory; 
} 
+0

Ihre 'getItemCount' 0 zurück sein sollte' Rückkehr mList.size () ' – Raghunandan

+0

Instant Run deaktivieren und versuchen, – Eenvincible

Antwort

0

Ich glaube, Sie haben zwei Fehler

@Override 
public int getItemViewType(int position) { 
    return position % 2 * 2; 
} 

Hier ermöglichen Sie es Produkte mit Viewtype = 0, 1 und 2. Und Sie sind wieder null wenn Sie einen Wert erhalten unterscheidet sich von 0 oder 1.

Erinnern Sie sich, wie Operatoren Präzedenz handhaben.

position % 2 * 2 

wird eval die gleiche wie

(position % 2) * 2 

Ich denke, was Sie hier wollen, ist so etwas wie

@Override 
public int getItemViewType(int position) { 
    return position % 2; 
} 

Auch Sie das Überschreiben der getItemCount Methode mit dem Wert 0 Dieses Mittel dass es auf dem RecyclerView keine Objekte gibt und daher dort nichts gerendert wird.

@Override 
public int getItemCount() { 
    return 0; 
} 

Ändern Sie den Wert Null mit einer Liste und seine Größe wie

... 
private List<Items> items; 
... 
@Override 
public int getItemCount() { 
    return items.size(); 
} 
+0

zu laden Während die App ohne Fehler läuft, gibt es immer noch nichts auf der li st. –

+0

Warte, ich bekomme jetzt einen Fehler. Ich werde den Beitrag bearbeiten. –

+0

Scheint, als hätten Sie null Elemente in Ihrer Liste, haben Sie es mit dem Debugger überprüft? –

0
@Override 
public int getItemCount() { 
    return 0; 
} 

zu

@Override 
public int getItemCount() { 
    return mList.size(); 
} 
Verwandte Themen