-1

У меня есть этот фрагмент с RecyclerViewInitialazing данные в RecyclerView

package com.example.myapplication; 

import android.annotation.TargetApi; 
import android.app.FragmentManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.app.Fragment; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RelativeLayout; 

import java.util.ArrayList; 
import java.util.List; 


public class Fragment_Username_Search extends Fragment { 
private List<User> userList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private UserAdapter userAdapter; 

    @TargetApi(Build.VERSION_CODES.M) 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    private void prepareUserData() { 
User user = new User(R.drawable.emilypic,"Marry Young","marbear",R.id.item_follow_button); 
userList.add(user); 
     user = new User(R.drawable.emilypic,"Marry Young","marbear",R.id.item_follow_button); 
     userList.add(user); 
     user = new User(R.drawable.emilypic,"Sammy Lee","sambam",R.id.item_follow_button); 
     userList.add(user); 
     user = new User(R.drawable.emilypic,"Lilly Martinson","lilmartini",R.id.item_follow_button); 
     userList.add(user); 
     userAdapter.notifyDataSetChanged(); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment__username__search, container, false); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView = (RecyclerView) view.findViewById(R.id.RecyclerView); 

     userAdapter = new UserAdapter(userList); 
prepareUserData(); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 

     recyclerView.setAdapter(userAdapter); 
     userAdapter.SetOnItemClickListener(new UserAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       FragmentManager fm = getFragmentManager(); 
       android.app.DialogFragment dialogFragment = new DialogFragment(); 


       dialogFragment.show(fm, "Sample Fragment"); 
      } 
     }); 


     return view; 
    } 


} 

и когда я должен использовать preparedata()? Когда я использую это после того, как

userAdapter = new UserAdapter(userList); 

то у меня есть только один пункт в моем списке Но в подготовке данных 4 элемента, как я могу это исправить? Когда я помещал prepareata() перед этим кодом (инициализировать адаптер), у меня есть ошибка, потому что notifyDataSetChanged наследует нулевой объект. UserAdapter:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder> { 
    private List<User> UserList; 
OnItemClickListener mItemClickListener; 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
RecyclerView.ViewHolder viewHolder = null; 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

        View viewUser = inflater.inflate(R.layout.row_item_layout,parent,false); 
        viewHolder = new MyViewHolder(viewUser,mItemClickListener); 


     return (MyViewHolder) viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     holder.UserTitle.setText(UserList.get(position).getTitle()); 
     holder.UserDescription.setText(UserList.get(position).getDescription()); 
     holder.UserIcon.setImageResource(R.drawable.emilypic); 
    } 


    public UserAdapter(List<User> UserList){ 
    this.UserList = UserList; 
} 
    @Override 
    public int getItemCount() { 
     return UserList.size(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public ImageView UserIcon; 
     public TextView UserTitle; 
     public TextView UserDescription; 
     public Button UserFollowButton; 
     public MyViewHolder(View itemView, UserAdapter.OnItemClickListener clickListener) { 
      super(itemView); 
      clickListener = (OnItemClickListener) mItemClickListener; 
      UserIcon = (ImageView) itemView.findViewById(R.id.item_icon); 
      UserTitle = (TextView) itemView.findViewById(R.id.item_title); 
      UserDescription = (TextView) itemView.findViewById(R.id.item_description); 
      UserFollowButton = (Button) itemView.findViewById(R.id.item_follow_button); 
//itemView.setOnClickListener(this); 
      UserFollowButton.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      mItemClickListener.onItemClick(v, getPosition()); 
     } 

    } 
    public interface OnItemClickListener{ 
     public void onItemClick(View view,int position); 

    } 
    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
    } 

} 

макет для фрагмента:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.myapplication.Fragment_Username_Search"> 
<LinearLayout 
    android:id="@+id/Search_field" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 

    > 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_search_black_48dp" 
     /> 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:tag="Search" 
     android:textIsSelectable="false" 

     /> 




</LinearLayout> 

    <android.support.v7.widget.RecyclerView 
     android:layout_below="@id/Search_field" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/RecyclerView" 

     > 

    </android.support.v7.widget.RecyclerView> 
</RelativeLayout> 

макета для элемента:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <ImageView 
     android:layout_width="70dp" 
     android:layout_height="70dp" 
     android:id="@+id/item_icon" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="8dp" 
     android:layout_marginRight="8dp" 
     android:layout_marginTop="1dp" 
     /> 
<LinearLayout 
    android:layout_toRightOf="@id/item_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    > 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" 
     android:id="@+id/item_title" 
     android:textSize="22dp" 
     android:textColor="@android:color/darker_gray" 

     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" 
     android:id="@+id/item_description" 
     android:textSize="16dp" 

     /> 
</LinearLayout> 
    <Button 
     android:layout_width="90dp" 
     android:layout_height="40dp" 
     android:id="@+id/item_follow_button" 
     android:layout_marginRight="30dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" 


     android:background="@drawable/follow_btn" 
     /> 
</RelativeLayout> 
+0

«тогда у меня есть только один элемент в моем списке» - означает ли это, что '(getItemCount() == 1)?' – 0X0nosugar

+0

Я видел только один элемент на экране – Rost

+1

сожалею о нисходящем (не я, мне нравятся вопросы с достаточным количеством кода, чтобы воспроизвести проблему). Я просто поместил ваш код в одно из моих приложений. Хорошая новость: у меня есть четыре элемента списка. Поэтому я думаю, что источник вашей проблемы должен быть в той части, которую я должен был исправлять: вы не размещали файлы макета. – 0X0nosugar

ответ

1

Вам не нужна эта линия userAdapter.notifyDataSetChanged() в вашей функции prepareUserData() , Затем поместите вызов prepareUserData() перед инициализацией UserAdapter и удалите вызов notifyDataSetChanged().

Кроме того, с помощью RecyclerView вы можете обновлять адаптер более эффективно, чем notifyDataSetChanged(), который является дорогостоящим. Проверьте, что для более подробной информации http://developer.android.com/intl/pt-br/reference/android/support/v7/widget/RecyclerView.Adapter.html

+0

Я пробовал это, но ничего не изменилось :(Один элемент в списке – Rost

+1

prepareUserData() только инициализирует одного пользователя, посмотрите, замените код prepareUserData() на этот код: пользователь User = новый пользователь (R.drawable.emilypic, "Marry Янг", "marbear", R.id.item_follow_button); userList.add (пользователь); user2 пользователь = новый пользователь (R .drawable.emilypic, "Marry Young", "marbear", R.id.item_follow_button); userList.add (пользователь); , а затем: userList.add (пользователь); userList.add (пользователь2); –

+0

Я пробовал это, но ничего не произошло. Если вы знаете структуры данных, список может иметь повторяющиеся записи, а не набор. – Rost