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