2016-09-23 2 views
2

Так что я не хочу добавлять объект в RecyclerView из фрагмента, который я знаю, как это сделать. Однако при добавлении объекта данные не отображаются. Вот мой код:Android - мои данные RecyclerView не отображаются

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) { 

    } 
} 

Основная деятельность:

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 - Отключен мгновенный запуск и получил это:

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) 

Пожалуйста, помогите!

Update:

Это, как я передаю информацию к моему list-

В моем фрагменте, где вы создаете новую заметку, есть два EditTexts. Затем информация из EditTexts передается в MainActivity.

@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); 
} 

Я извлекаю информацию, используя комплект.

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

Тогда добавьте его в свой список.

mList.add(mNote); 

На боковой ноте, вот как я инициализировал свой список.

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

ObjectModel.

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

Ваш 'getItemCount' возвращает 0. Если бы' вернуть mList.size () ' – Raghunandan

+0

Отключить немедленный запуск и попробовать загрузить – Eenvincible

ответ

0

Я думаю, что у вас есть два ошибки

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

Здесь вы позволяете элементы с ViewType = 0, 1 и 2. И вы возвращаете нуль если вы получаете значение отличные от 0 или 1.

Помните, как операторы обрабатывают приоритет.

position % 2 * 2 

будет Eval же, как

(position % 2) * 2 

Я думаю, что вы хотите здесь что-то вроде

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

Кроме того, вы переопределение метода getItemCount со значением 0. Это означает, что в RecyclerView нет элементов, и, следовательно, ничего не получится.

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

Изменение нулевого значения со списком и его размер, как

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

Пока приложение работает без ошибок, на листе все еще ничего не отображается ул. –

+0

Держись, я, кажется, получаю сообщение об ошибке. Я отредактирую сообщение. –

+0

Похоже, что у вас есть нулевые элементы внутри вашего списка, вы проверили его с помощью отладчика? –

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

в

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