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

时间:2018-07-02 09:00:39

标签: android android-recyclerview

我很想在我的应用this中实现可扩展回收视图。 因此,我将一个项目作为进行测试的一部分,并且在我了解到它的工作方式后,在我的应用程序中对其进行了改进,但是遇到了一些问题。

我使用了来自ERV github的this类通过应用程序进行构建,并且我在布局中添加了2个EditText和2个buttons,因此如果我在“ GENRE” edittext中写了一些东西,然后按“ ADDER GENRE”按钮,则会将其存档;如果我在RecyclerView中放入一些东西,然后按添加艺术家我希望将其添加到EditText中最后添加的GENRE项目中。

这是我的MainActivity中的代码。

RecyclerView

这是我的适配器代码

公共类GenreAdapter扩展了ExpandableRecyclerViewAdapter {

    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);
    }

}

}

1 个答案:

答案 0 :(得分:1)

此答案无效,请参见下面的修改

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

因此,如果要将子级添加到最后一个现有组中,只需(在适配器中):

public void addChild(YourChildType child){
    // I assume the 'groups' list is accessible in your Adapter
    // Retrieve the last group (it's a basic implementation, you may want to check if the list is not empty to prevent an OutOfBoundsException)
    GroupType group = groups.get(groups.size());
    group.getItems().add(child);
    notifyDataSetChanged(); 
}

如果要添加新组:

public void addGroup(GroupType group){
   groups.add(group);
   notifyDataSetChanged(
}

编辑:更新的答案

事实证明,一旦创建了适配器(see the response from the author here),就无法更改数据集(p)

因此,您需要将Genre的列表存储在MainActivity中。每次您想要更新列表时,都应该这样做:

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); 
}