Android 如何以编程方式添加子项和父项[ExpandableRecyclerView]?

Android 如何以编程方式添加子项和父项[ExpandableRecyclerView]?,android,android-recyclerview,Android,Android Recyclerview,实际上,我正试图在我的应用程序可扩展回收器视图中实现。 所以我做了一个项目作为测试的一部分,就在我在我的应用程序中了解到它是如何工作的之后,但我遇到了一些问题 我使用了来自ERV github的classe进行应用程序构建,在布局中添加了2个EditText,并添加了2个按钮,以便如果我在“流派”中编写内容,我会将其存档edittext然后我按下添加流派按钮,将在RecyclerView中添加一个项目,如果我在edittextArtist中添加了一些内容,我将按ADD Artist,我希望它将添

实际上,我正试图在我的应用程序可扩展回收器视图中实现。 所以我做了一个项目作为测试的一部分,就在我在我的应用程序中了解到它是如何工作的之后,但我遇到了一些问题

我使用了来自ERV github的classe进行应用程序构建,在布局中添加了2个
EditText
,并添加了2个
按钮
,以便如果我在“流派”中编写内容,我会将其存档
edittext
然后我按下添加流派按钮,将在
RecyclerView
中添加一个项目,如果我在
edittext
Artist中添加了一些内容,我将按ADD Artist,我希望它将添加到
RecyclerView
中最后添加的流派项目中

这是我主要活动中的代码

    public class MainActivity extends AppCompatActivity {

    public GenreAdapter adapter;

    List<Genre> parent;
    EditText artistTXT;
    EditText genreTXT;
    List<Artist> child;
    Button addART;
    Button addGENR;

    RecyclerView mRecyclerView;


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

        artistTXT = findViewById(R.id.ArtistTXT);
        genreTXT = findViewById(R.id.GenreTXT);

        addART = findViewById(R.id.AddArtist);
        addGENR = findViewById(R.id.AddGenre);



        child = new ArrayList<>();
        parent = new ArrayList<>();

        addART.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                adapter.addChild(new Artist(artistTXT.getText().toString()));

            }
        });


        addGENR.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            adapter.addGroup(new Genre(genreTXT.getText().toString(),null));

            }
        });


        Button clear = findViewById(R.id.toggle_button);
        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



            }
        });

        BuildRecyclerView();

    }

    public void BuildRecyclerView(){
        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        GenreAdapter adapter = new GenreAdapter(parent,this);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(adapter);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        adapter.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        adapter.onRestoreInstanceState(savedInstanceState);
    }

}
public类MainActivity扩展了AppCompatActivity{
公共GenreAdapter适配器;
列出父母;
编辑文本artistTXT;
编辑文本genreTXT;
列出儿童;
巴顿·阿达特;
按钮添加器;
回收视图mRecyclerView;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
artistTXT=findViewById(R.id.artistTXT);
genreTXT=findviewbyd(R.id.genreTXT);
addART=findviewbyd(R.id.AddArtist);
addGENR=findviewbyd(R.id.AddGenre);
child=newarraylist();
父项=新的ArrayList();
addART.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addChild(新艺术家(artistTXT.getText().toString());
}
});
addGENR.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addGroup(新类型(genreTXT.getText().toString(),null));
}
});
按钮清除=findviewbyd(R.id.toggle_按钮);
clear.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
}
});
BuildRecyclerView();
}
公共void BuildRecyclerView(){
mRecyclerView=findviewbyd(R.id.recycler\u视图);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager=新的LinearLayoutManager(此);
GenreAdapter adapter=新的GenreAdapter(父级,this);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(适配器);
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
适配器。onSaveInstanceState(超出状态);
}
@凌驾
RestoreInstanceState上的受保护无效(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
适配器.onRestoreInstanceState(savedInstanceState);
}
}
这是我的适配器代码

公共类GenreAdapter扩展了ExpandableRecycleServiceAdapter{

Context context ;
LayoutInflater inflater ;
List<Genre> genres;

public GenreAdapter(List<? extends ExpandableGroup> groups, Context context) {
    super(groups);
    this.context = context ;
    inflater = LayoutInflater.from(context);
}

@Override
public GenreViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.list_item_genre, parent, false);
    return new GenreViewHolder(view);
}

@Override
public ArtistViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.list_item_artist, parent, false);
    return new ArtistViewHolder(view);
}

@Override
public void onBindChildViewHolder(ArtistViewHolder holder, int flatPosition,
                                  ExpandableGroup group, int childIndex) {

    final Artist artist = (Artist) group.getItems().get(childIndex);
    holder.setArtistName(artist.getName());
}

@Override
public void onBindGroupViewHolder(GenreViewHolder holder, int flatPosition,
                                  ExpandableGroup group) {

    holder.setGenreTitle(group);
}


public void addChild(Artist child){
    // I assume the 'groups' list is accessible in your Adapter
    Genre group = genres.get(genres.size());
    group.getItems().add(child);
    notifyDataSetChanged();
}

public void addGroup(Genre group){
    genres.add(group);
    notifyDataSetChanged();
}
语境;
充气机;
列出流派;

public GenreAdapter(List此答案无效,请参见下面的编辑

您有一个包含子项的组列表

因此,如果要将子级添加到上一个现有组,只需执行以下操作(在适配器中):

如果要添加新组,请执行以下操作:

public void addGroup(GroupType group){
   groups.add(group);
   notifyDataSetChanged(
}
编辑:更新答案

事实证明,一旦创建了适配器()

因此,您需要在
MainActivity
中存储您的
Genre
列表。每次要更新列表时,您应该执行以下操作:

List<Genre> mGenres;
GenreAdapter mAdapter;

public void addGenre(Genre genre){ 
    mGenres.add(genre); 
    mAdapter = new GenreAdapter(genres, ...); 
    mRecyclerView.setAdapter(mAdapter); 
}

public void removeGenre(Genre genre){ 
    mGenres.remove(genre); 
    mAdapter = new GenreAdapter(genres, ...); 
    mRecyclerView.setAdapter(mAdapter); 
}
列出mGenres;
GenreAdapter-mAdapter;
公共类型(类型类型){
添加(体裁);
mAdapter=新的流派(流派,…);
mRecyclerView.setAdapter(mAdapter);
}
公共空间移除(体裁){
删除(体裁);
mAdapter=新的流派(流派,…);
mRecyclerView.setAdapter(mAdapter);
}

通过在适配器中添加addChild,我得到了一个错误,我添加了问题中的代码。您能检查一下吗?“'com.thoughtbot…'中没有默认构造函数可用”我在我的问题中添加了它,因为它应该是
public void addChild
。我错过了
void
,所以addChild被认为是一个构造函数。我更新了我的答案我用addChild和addGroup更新了我的main活动,但当我试图添加组时,应用程序崩溃了addGroup,尝试在空对象引用上添加方法“:这是因为
列表类型;
从未设置。请执行
最终列表类型;
并在构造函数
genres=groups
中进行设置。但是如果可以从适配器直接访问
groups
,则无需创建
类型
。只需直接使用
groups
List<Genre> mGenres;
GenreAdapter mAdapter;

public void addGenre(Genre genre){ 
    mGenres.add(genre); 
    mAdapter = new GenreAdapter(genres, ...); 
    mRecyclerView.setAdapter(mAdapter); 
}

public void removeGenre(Genre genre){ 
    mGenres.remove(genre); 
    mAdapter = new GenreAdapter(genres, ...); 
    mRecyclerView.setAdapter(mAdapter); 
}