1

在我的项目中,我必须在 listview 或 recyclerview 中使用 Expandable 功能。我选择了recyclerview,因为它的性能更好。

但我必须制作可扩展版本所以我在这里得到了非常好的库 ,它真的很好用。但是后来我遇到了一个问题,如下所示

  • 我想从 Web 服务中填充子视图信息,当用户单击父项时应该调用该信息。我不知道如何使用同一个库来完成
  • 我想制作永无止境的 RecyclerView,所以这意味着我必须使用诸如 pull 之类的东西来刷新类型的东西,但是当用户到达 RecyclerView 的末尾时就会发生这种情况。知道如何使用同一个库实现这两个功能吗?

请帮助我并向我展示这样做的正确方法。至少对于第一次混乱。提前致谢

更新1:

我在下面分享的源代码是来自这个库演示的代码在这个代码片段中你可以看到他在创建父列表(组列表)的对象时正在设置子列表(项目列表)。从网络服务获取后我想在哪里填写子列表

public class Recipe implements ParentListItem {

private String mName;
private List<Ingredient> mIngredients;

public Recipe(String name, List<Ingredient> ingredients) {
    mName = name;
    mIngredients = ingredients;
}

public String getName() {
    return mName;
}

@Override
public List<?> getChildItemList() {
    return mIngredients; // How can I return list after getting data from the web service 
}

@Override
public boolean isInitiallyExpanded() {
    return false;
}

}

他将其设置为

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

    Ingredient beef = new Ingredient("beef");
    Ingredient cheese = new Ingredient("cheese");
    Ingredient salsa = new Ingredient("salsa");
    Ingredient tortilla = new Ingredient("tortilla");
    Ingredient ketchup = new Ingredient("ketchup");
    Ingredient bun = new Ingredient("bun");

    Recipe taco = new Recipe("taco", Arrays.asList(beef, cheese, salsa, tortilla));
    Recipe quesadilla = new Recipe("quesadilla", Arrays.asList(cheese, tortilla));
    Recipe burger = new Recipe("burger", Arrays.asList(beef, cheese, ketchup, bun));
    final List<Recipe> recipes = Arrays.asList(taco, quesadilla, burger);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    mAdapter = new RecipeAdapter(this, recipes);
    mAdapter.setExpandCollapseListener(new ExpandableRecyclerAdapter.ExpandCollapseListener() {
        @Override
        public void onListItemExpanded(int position) {
            Recipe expandedRecipe = recipes.get(position);

            String toastMsg = getResources().getString(R.string.expanded, expandedRecipe.getName());
            Toast.makeText(VerticalLinearRecyclerViewSampleActivity.this,
                    toastMsg,
                    Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        public void onListItemCollapsed(int position) {
            Recipe collapsedRecipe = recipes.get(position);

            String toastMsg = getResources().getString(R.string.collapsed, collapsedRecipe.getName());
            Toast.makeText(VerticalLinearRecyclerViewSampleActivity.this,
                    toastMsg,
                    Toast.LENGTH_SHORT)
                    .show();
        }
    });

    recyclerView.setAdapter(mAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

错误日志 当我尝试从 web 服务填充成分列表时发生此错误。我做了什么我将成分列表设为静态,并从 web 服务中静态设置它并从覆盖函数中检索它

进程:com.naziraschool.nazraschoolsystem,PID:484 java.lang.IndexOutOfBoundsException:无效索引 4,大小为 4 在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 在 java.util.ArrayList.remove(ArrayList. java:403) 在 com.bignerdranch.expandablerecyclerview.Adapter.ExpandableRecyclerAdapter.collapseParentListItem(ExpandableRecyclerAdapter.java:604) 在 com.bignerdranch.expandablerecyclerview.Adapter。ExpandableRecyclerAdapter.onParentListItemCollapsed(ExpandableRecyclerAdapter.java:274) 在 com.bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder.collapseView(ParentViewHolder.java:164) 在 com.bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder.onClick(ParentViewHolder.java:124)bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder.onClick(ParentViewHolder.java:124)bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder.onClick(ParentViewHolder.java:124)

4

1 回答 1

0

阅读这个库的文档,我看到了下面的片段,可以让你监听父扩展

MyAdapter adapter = new MyAdapter(this, recipes);

adapter.setExpandCollapseListener(new ExpandableRecyclerAdapter.ExpandCollapseListener() {
    @Override
    public void onListItemExpanded(int position) {
        Recipe expandedRecipe = recipes.get(position);
        // ...
    }

    @Override
    public void onListItemCollapsed(int position) {
        Recipe collapsedRecipe = recipes.get(position);
        // ...
    }
});

mRecyclerView.setAdapter(adapter);

在该onListItemExpanded方法中,您应该进行网络调用并在适配器中加载数据,然后调用notifyDataSetChanged()以刷新数据。

于 2016-08-17T04:07:25.087 回答