有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java RecylerView并没有在片段中出现

在我的片段中,recyclerview没有出现。当我尝试在我的活动中按预期填充结果时,但在我的片段中,当我启动recyclerview时,它没有显示空白。 是,我的适配器中有getItemCount(它已经在同一适配器的othr活动中工作) 我的片段初始化

      public static ProfileSearchFragment newInstance(String searchText,String algoliaKey, String applicationId) {
    ProfileSearchFragment fragment = new ProfileSearchFragment();
    Bundle args = new Bundle();
    args.putString(SearchText, searchText);
    args.putString(AlgoliaKey, algoliaKey);
    args.putString(ApplicationId, applicationId);
    fragment.setArguments(args);
    return fragment;
}

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mSearchText = getArguments().getString(SearchText);
        mAlgoliaKey = getArguments().getString(AlgoliaKey);
        mApplicationId = getArguments().getString(ApplicationId);

    }
}

在onCreateView和onViewCreated中都尝试过:

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

    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_profile_search, container, false);

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    RecyclerView recyclerView = view.findViewById(R.id.profile_search_recyclerview);

    Log.d(TAG, "onCreateView: getting the Searchtext hopefully  " + mSearchText + ":" + mAlgoliaKey);

    mUserImage = new ArrayList<>();
    mUserName = new ArrayList<>();
    mUserId = new ArrayList<>();


    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));


    recyclerView.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    linearLayoutManager.setSmoothScrollbarEnabled(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    userSearchAdapter = new UserSearchAdapter(getContext(),mUserImage,mUserName,mUserId);
    recyclerView.setAdapter(userSearchAdapter);


    final Client client = new Client(mApplicationId, mAlgoliaKey);
    final Index index = client.getIndex("Users");

    if (mSearchText!=null){
        Query query = new Query(mSearchText)
                .setAttributesToRetrieve("user_username", "user_image_url", "user_id")
                .setHitsPerPage(50);
        index.searchAsync(query, new CompletionHandler() {
            @Override
            public void requestCompleted(JSONObject content, AlgoliaException error) {
                try {
                    JSONArray hits = content.getJSONArray("hits");
                    List<String> list = new ArrayList<>();
                    for (int i = 0; i < hits.length(); i++) {

                        JSONObject jsonObject = hits.getJSONObject(i);
                        mUserName.add(jsonObject.getString("user_username"));
                        Log.d(TAG, "requestCompleted: Userrrrr: " + jsonObject.getString("user_username"));
                        mUserImage.add(jsonObject.getString("user_image_url"));
                        mUserId.add(jsonObject.getString("user_id"));

                        Log.d(TAG, "requestCompleted: Size: " + mUserImage.size());
                        userSearchAdapter.notifyDataSetChanged();
                    }


                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });


    }

当我记录时,我会得到数组的大小,并用值填充数组

在我的主要活动中,我使用viewpager2来设置我的片段

      private void setUpViewPager(){
    SectionPagerAdapter adapter = new SectionPagerAdapter(this);

    adapter.addFragment(new ProfileSearchFragment());
    adapter.addFragment(new TemplateSearchTagsFragment());
    ViewPager2 viewPager2 = findViewById(R.id.search_viewpager);
    viewPager2.setAdapter(adapter);

}

  @Override
        public void afterTextChanged(Editable editable) {

            ProfileSearchFragment fragment = ProfileSearchFragment.newInstance(editable.toString(),algoliaKey,applicationId);
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            transaction.addToBackStack(null);
            transaction.add(fragment,"profile_search_fragment").commit();

           
        }
    });

谁能帮我指出错误吗。谢谢

我的适配器:

  public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.SearchViewHolder> {

private static final String TAG = "UserSearchAdapter";
private Context mContext;
private ArrayList<String> mUserImage = new ArrayList<>();
private ArrayList<String> mUserName = new ArrayList<>();
private ArrayList<String> mUserId = new ArrayList<>();

public UserSearchAdapter(Context mContext, ArrayList<String>
        mUserImage, ArrayList<String> mUserName, ArrayList<String> mUserId) {
    this.mContext = mContext;
    this.mUserImage = mUserImage;
    this.mUserName = mUserName;
    this.mUserId = mUserId;
}

@NonNull
@Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.user_item,parent,false);
    SearchViewHolder holder = new SearchViewHolder(view);
    return holder;
}

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

    Glide.with(mContext)
            .load(mUserImage.get(position))
            .placeholder(R.drawable.ic_profile)
            .into(holder.image_profile);

    holder.btn_follow.setVisibility(View.VISIBLE);
    holder.username.setText(mUserName.get(position));
 }

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

class SearchViewHolder extends RecyclerView.ViewHolder{

    private TextView username,fullname;
    private CircleImageView image_profile;
    private Button btn_follow;

    public SearchViewHolder(@NonNull View itemView) {
        super(itemView);
        username = itemView.findViewById(R.id.username);
        fullname = itemView.findViewById(R.id.fullname);
        image_profile = itemView.findViewById(R.id.image_profile);
        btn_follow = itemView.findViewById(R.id.btn_follow);
    }
}

我的日志打印:

2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Size:1

2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Userrrrr:Algolia2 2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Size:2

2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Userrrrr:Giraffe 2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Size:3

2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Userrrrr:zumba 2020-06-26 17:56:36.0143620-3620/com。湿婆。memesapp D/ProfileSearchFragment:requestCompleted:Size:4

my log and debug


共 (2) 个答案

  1. # 1 楼答案

    请检查您的适配器实现userSearchAdapter.notifyDataSetChanged();在for循环中被多次调用。请把它移到for循环之外。一旦数据集准备好。更新适配器,然后通知更改。目前,您刚刚创建了一个空的list。你不能在任何地方使用它。如果我理解正确,您将用必填项填写此列表,并将其传递给适配器以供显示

  2. # 2 楼答案

    您正在使用空数组列表初始化RV适配器,稍后在回调方法中获取数据时

    requestCompleted

    您没有将数据设置到适配器

    RV适配器中应该有一种方法,如

    userSearchAdapter.updateData(<updated data>)
    

    然后你给notifyDataSetChanged打电话

    userSearchAdapter.notifyDataSetChanged()
    

    在适配器上