You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从服务器获取数据加载至RecyclerView失败问题求助

Hey there! Let's troubleshoot why your RecyclerView is staying blank even though you've successfully fetched those usernames via AsyncTask and JSON. Here's how to fix it step by step:

1. Double-Check Your Custom Adapter

First, make sure your adapter is properly set up to handle the username data. These are the critical bits to verify:

  • You have a member variable in the adapter to hold the username list (like private List<String> usernameList)
  • The adapter's constructor correctly assigns the passed-in list to this variable
  • getItemCount() returns the actual size of the list (not 0 or a fixed number)
  • onBindViewHolder() properly sets the username text to your TextView in container.xml

Here's a corrected adapter example to reference:

public class UsernameAdapter extends RecyclerView.Adapter<UsernameAdapter.UsernameViewHolder> {
    private List<String> usernameList;

    // Constructor to receive data
    public UsernameAdapter(List<String> usernameList) {
        this.usernameList = usernameList;
    }

    @NonNull
    @Override
    public UsernameViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // Inflate your container.xml layout
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.container, parent, false);
        return new UsernameViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull UsernameViewHolder holder, int position) {
        // Bind the username to the TextView
        String username = usernameList.get(position);
        holder.usernameTextView.setText(username);
    }

    @Override
    public int getItemCount() {
        // Return the actual list size (handle null case to avoid crashes)
        return usernameList != null ? usernameList.size() : 0;
    }

    // ViewHolder class to hold references
    public static class UsernameViewHolder extends RecyclerView.ViewHolder {
        TextView usernameTextView;

        public UsernameViewHolder(@NonNull View itemView) {
            super(itemView);
            // Match this ID to the TextView in your container.xml
            usernameTextView = itemView.findViewById(R.id.tv_username);
        }
    }
}
2. Fix the AsyncTask UI Update Logic

AsyncTask's doInBackground runs on a background thread—you can't update the RecyclerView here. All UI updates need to happen in onPostExecute, which runs on the main thread. Here's how to correctly wire this up in your MainActivity:

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private UsernameAdapter adapter;
    private List<String> usernameList = new ArrayList<>();

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

        // Initialize RecyclerView with LayoutManager and Adapter
        recyclerView = findViewById(R.id.recycler_view); // Match this ID to your mainactivity.xml RecyclerView
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new UsernameAdapter(usernameList);
        recyclerView.setAdapter(adapter);

        // Start fetching data
        new FetchUsernamesTask().execute();
    }

    private class FetchUsernamesTask extends AsyncTask<Void, Void, List<String>> {
        @Override
        protected List<String> doInBackground(Void... voids) {
            // Your existing JSON fetch and parsing code goes here
            // Return the list of usernames you've parsed
            List<String> fetchedUsernames = new ArrayList<>();
            // ... (your existing logic to get usernames from JSON)
            return fetchedUsernames;
        }

        @Override
        protected void onPostExecute(List<String> fetchedUsernames) {
            super.onPostExecute(fetchedUsernames);
            // Update the data list and notify the adapter to refresh
            usernameList.clear();
            usernameList.addAll(fetchedUsernames);
            // *Critical*: Tell the adapter the data has changed
            adapter.notifyDataSetChanged();
        }
    }
}
3. Validate Your Layout Files

Blank RecyclerViews often come from layout issues. Check these:

  • mainactivity.xml: Ensure your RecyclerView has match_parent for width and height (so it takes up the screen), and its ID matches what you use in code:
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
  • container.xml: Make sure your TextView has a valid ID (matching what's in your ViewHolder) and proper layout parameters so it's visible:
    <TextView
        android:id="@+id/tv_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="16sp" />
    
4. Avoid These Common Mistakes
  • Never update the adapter or RecyclerView in doInBackground—only in onPostExecute or other main-thread methods
  • Always call notifyDataSetChanged() (or more specific notify methods) after updating the adapter's data
  • Don't forget to set a LayoutManager on your RecyclerView—without it, no items will display
  • Ensure getItemCount() returns the actual size of your data list, not 0

内容的提问来源于stack exchange,提问作者Arjun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:37:49