【问题标题】:RecyclerView is not Iterating the layout [duplicate]RecyclerView 没有迭代布局[重复]
【发布时间】:2019-12-14 10:16:14
【问题描述】:

我正在为我的 android 应用程序创建一个 RecyclerView,其中包含一些具有两组数据的虚拟数据。但是布局没有迭代两次,而是正确显示了第一个数据。

public class HomeScreenFragment extends Fragment {

    private ArrayList<String> flags = new ArrayList<>();
    private ArrayList<String> leagues = new ArrayList<>();
    private ArrayList<String> dates = new ArrayList<>();

    private Context context;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        initData();

    }

    private void initData() {
        leagues.add("Indian premiere league");
        dates.add("03-Dec");

        leagues.add("Srilankan Premiere league");
        dates.add("04-Dec");

        initRecyclerView();
    }

    private void initRecyclerView() {
        RecyclerView recyclerView = getView().findViewById(R.id.homeRecyclerView);
        HomeScreenRVAdapter adapter = new HomeScreenRVAdapter(flags,leagues,dates,context);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
    }
}

回收站视图

public class HomeScreenRVAdapter extends RecyclerView.Adapter<HomeScreenRVAdapter.ViewHolder> {
    private static final String TAG = "HomeScreenRVAdapter";

    private String BASE_URL, API_KEY;

    private ArrayList<String> flags = new ArrayList<>();
    private ArrayList<String> leagues = new ArrayList<>();
    private ArrayList<String> dates = new ArrayList<>();
    private Context context;

    public HomeScreenRVAdapter(ArrayList<String> flags, ArrayList<String> leagues, ArrayList<String> dates, Context context) {
        this.flags = flags;
        this.leagues = leagues;
        this.dates = dates;
        this.context = context;
    }

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

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        holder.league.setText(leagues.get(position));
        holder.date.setText(dates.get(position));
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        // HEADER WIDGETS
        ExpansionHeader expansionHeader;
        ImageView flag;
        TextView league, date;

        // LAYOUT WIDGETS
        ExpansionLayout expansionLayout;
        TextView minutes, local, visitor, localScore, visitorScore;
        ImageView favourite;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            expansionHeader = itemView.findViewById(R.id.expansionHeader);
            flag = itemView.findViewById(R.id.headerFlag);
            league = itemView.findViewById(R.id.expansionHeaderLeague);
            date = itemView.findViewById(R.id.expansionHeaderDate);

        }
    }
}

我想让应用在数据到来时迭代布局 (layout_home) 的次数。但它不是迭代的。否则无论如何只迭代扩展布局?

【问题讨论】:

  • 您的 recyclerView 和您的适配器未正确实现。而且您不需要将您的旗帜、联赛和日期分成 3 个 ArrayList。您只能在一个 ArrayList 中执行这些操作。
  • @Mak-MakBasaya 您能否详细说明实施问题?如果只是三个不同的数组,那么我认为不会导致这样的错误。
  • 这里的问题是布局没有迭代
  • @deluxan 如果你也发布你的布局文件会很有帮助(layout_home)
  • 在 layout_home.xml 中从 android:layout_height="match_parent" 更改为 android:layout_height="wrap_content" 后它正在工作

标签: android android-recyclerview


【解决方案1】:

您的代码看起来不错。 layout_home 中很可能存在问题。确保 android:layout_height 设置为 wrap_content

此外,您可以实现自定义对象ArrayList,而不是创建三个单独的对象。自定义对象将保存每个项目的属性。但是,这是一个建议,我认为这不是您面临的错误的原因。

【讨论】:

  • 你是个天才。这就是问题所在。现在一切正常
  • 啊谢谢!乐于助人:)
【解决方案2】:

接受的答案是正确的答案,但我为您制定了另一种方法和良好的编码实践。

首先,我们需要初始化RecyclerView

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        RecyclerView recyclerView = getView().findViewById(R.id.homeRecyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        HomeScreenRVAdapter adapter = new HomeScreenRVAdapter();
        recyclerView.setAdapter(adapter);

    }

然后创建名为HomeScreenRVAdapter.java

的recyclerView Adapter
public class HomeScreenRVAdapter extends RecyclerView.Adapter<HomeScreenRVAdapter.ViewHolder> {

    private List<League> leagues = new ArrayList<>();

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_home, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        League league = leagues.get(position);
        holder.league.setText(league.getLeague());
        holder.date.setText(league.getDate());
    }

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

    void setList(List<League> list) {
        this.leagues = list;
        notifyDataSetChanged();
    }


    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView flag;
        TextView league, date;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            flag = itemView.findViewById(R.id.headerFlag);
            league = itemView.findViewById(R.id.expansionHeaderLeague);
            date = itemView.findViewById(R.id.expansionHeaderDate);
        }
    }
}

创建名为 League.java

的 getter 和 setter 类
class League {
    private String flag;
    private String league;
    private String date;

    public League(String flag, String league, String date) {
        this.flag = flag;
        this.league = league;
        this.date = date;
    }

    public String getFlag() {
        return flag;
    }

    public String getLeague() {
        return league;
    }

    public String getDate() {
        return date;
    }
}

然后在你的 onViewCreated() 中像这样添加你的数据。

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        ...

        List<League> leagues = new ArrayList<>();
        leagues.add(new League("Flag1","Indian premiere league","03-Dec"));
        leagues.add(new League("Flag2","Srilankan Premiere league","04-Dec"));

        adapter.setList(leagues);
    }

notifyDataSetChanged();

非常重要。数据更改后不要忘记添加。

【讨论】:

  • 感谢您的建议。我会试试的。假设如果我从 api 获取一个字符串并将其存储在一个变量中,并且我正在执行以下编码但它显示为空。无论如何,字符串在日志中显示数据。 new Response.Listener&lt;JSONObject&gt;() { @Override public void onResponse(JSONObject response) { try { JSONArray jsonArray = response.getJSONArray("data"); for(int i = 0; i &lt; jsonArray.length(); i++) { JSONObject data = jsonArray.getJSONObject(i); Log.d("League ID", league_id); leagues.add(league_id); // This thing is not working}
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2019-01-02
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多