Android 在RecyclerView中初始化数据

Android 在RecyclerView中初始化数据,android,android-fragments,android-recyclerview,android-sdk-tools,Android,Android Fragments,Android Recyclerview,Android Sdk Tools,我有这个片段和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.DefaultI

我有这个片段和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;
    }


}

然后,我的列表中只有一项。但在“准备数据”中有4个元素,我如何修复它?当我将preparedata()放在这段代码(初始化适配器)之前时,我出现了错误,因为notifyDataSetChanged回调到空对象。 用户适配器:

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

}
公共类UserAdapter扩展了RecyclerView.Adapter{ 私有列表用户列表; OnItemClickListener mItemClickListener; 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ RecyclerView.ViewHolder ViewHolder=null; LayoutInflater充气器=LayoutInflater.from(parent.getContext()); 视图用户=充气机。充气(R.layout.row\u item\u layout,parent,false); viewHolder=新的MyViewHolder(viewUser,mItemClickListener); return(MyViewHolder)viewHolder; } @凌驾 公共无效onBindViewHolder(MyViewHolder,int位置){ holder.UserTitle.setText(UserList.get(position.getTitle()); holder.UserDescription.setText(UserList.get(position.getDescription()); holder.UserIcon.setImageResource(R.drawable.emilypic); } 公共用户适配器(列表用户列表){ this.UserList=UserList; } @凌驾 public int getItemCount(){ 返回UserList.size(); } 公共类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 公共图像视图用户图标; 公共文本视图用户标题; 公共文本视图用户描述; 公共按钮UserFollowButton; 公共MyViewHolder(查看项目视图,UserAdapter.OnItemClickListener clickListener){ 超级(项目视图); clickListener=(OnItemClickListener)mItemClickListener; UserIcon=(ImageView)itemView.findViewById(R.id.item_图标); UserTitle=(TextView)itemView.findViewById(R.id.item\u title); UserDescription=(TextView)itemView.findViewById(R.id.item\u description); UserFollowButton=(按钮)itemView.findViewById(R.id.item\u follow\u按钮); //setOnClickListener(这个); UserFollowButton.setOnClickListener(此); } @凌驾 公共void onClick(视图v){ onItemClick(v,getPosition()); } } 公共接口侦听器{ 公共虚线单击(视图,int位置); } 公共void SetOnItemClickListener(最终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>

在函数prepareUserData()中不需要此行userAdapter.notifyDataSetChanged()。然后,将对prepareUserData()的调用放在UserAdapter初始化之前,并删除对notifyDataSetChanged()的调用


除此之外,使用RecyclerView可以比notifyDataSetChanged()更高效地更新适配器iTen,后者成本高昂。查看更多详细信息

“那么我的列表中只有一个项目”-这是否意味着
(getItemCount()==1)?
我在屏幕上只看到了一个项目。很抱歉,投票失败(不是我,我喜欢有足够代码的问题来重现问题),我只是将你的代码放入了我的一个应用程序中。好消息是:我有四个列表项。因此,我认为您的问题的根源一定是我必须修补的部分:您没有发布布局文件。没有问题,我非常感谢您的帮助。几秒钟后我将添加布局文件。@Rost您可以打印--public int getItemCount(){return UserList.size();//print this}我尝试了这个,但没有改变:(listprepareUserData()上的一个元素只初始化一个用户,看,将prepareUserData()的代码替换为:User User User=new User(R.drawable.emilypic,“Mary Young”,“marbear”,R.id.item\u follow\u按钮);userList.add(User);User user2=新用户(R.drawable.emilypic,“Mary Young”,“marbear”,R.id.item\u follow\u按钮);userList.add(user);然后:userList.add(user);userList.add(user2);我尝试了这个方法,但什么都没有发生。如果您知道数据结构列表可以有重复记录,它不是一个集合。所以在调用prepareUserData()后调试代码然后检查是否有四个用户和answear me的实例。我尝试了你在我的问题之前所说的,但这没有给出结果
   <?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>