#java #android #arraylist #android-recyclerview
#java #Android #arraylist #android-recyclerview
Вопрос:
Я пытаюсь создать вложенную программу RecyclerView. Итак, я запрограммировал 2 RecyclerView
для родительского списка и дочернего списка, и из этой программы я создаю 2 адаптера, дочерний адаптер предназначен как подпункты данных, а родительский адаптер — для извлечения элементов данных и списков из подпунктов данных, что означает, что родительский адаптер имеет 2 атрибута, а именно родительский элемент данных и списокдочерний элемент и родительский элемент recycler. Иллюстрация для списка выглядит следующим образом: Вложенный RecyclerView
Как видно из рисунка на иллюстрации, данные из дочернего класса вводятся в соответствии с количеством элементов, поскольку схема ввода данных для списка выглядит следующим образом: Входные данные
И из подробного действия (для ввода данных) Я использую функции putExtra
и getStringExtra
для отправки входных данных друг другу.
DetailActivity.java
public class DetailActivity extends AppCompatActivity implements View.OnClickListener {
LinearLayout layoutRow;
List<Childs> titleList = new ArrayList<>();
String txname, txsubname;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
layoutRow = findViewById(R.id.layout_list);
EditText title = findViewById(R.id.edt_name);
txname = title.getText().toString();
findViewById(R.id.btn_add_item).setOnClickListener(this);
findViewById(R.id.btn_submit).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_add_item:
addView();
break;
case R.id.btn_submit:
if(checkValidate()){
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("name",txname);
intent.putExtra("subname",txsubname);
startActivity(intent);
}
}
}
private boolean checkValidate(){
titleList.clear();
boolean result = true;
for (int i = 0;i < layoutRow.getChildCount();i ){
View listview = layoutRow.getChildAt(i);
EditText items = listview.findViewById(R.id.edt_item);
txsubname = items.getText().toString();
Childs childs = new Childs();
if (!items.getText().toString().isEmpty()){
childs.setTitle(items.getText().toString());
} else {
result = false;
break;
}
titleList.add(childs);
}
if (titleList.size() == 0){
result = false;
Toast.makeText(this, "Data Kosong", Toast.LENGTH_SHORT).show();
} else if(!result){
Toast.makeText(this, "Semua Data Kosong!", Toast.LENGTH_SHORT).show();
}
return resu<
}
private void addView(){
final View titleView = getLayoutInflater().inflate(R.layout.row_add_item,null,false);
EditText txsubname = titleView.findViewById(R.id.edt_item);
ImageButton btnClose = titleView.findViewById(R.id.bt_close_item);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeView(titleView);
}
});
layoutRow.addView(titleView);
}
private void removeView(View titleView) {
layoutRow.removeView(titleView);
}
}
MainActivity.java (править)
private List<Parents> ItemData() {
List<Parents> listParent = new ArrayList<>();
for(int i = 0; i < listParent.size();i ){
Parents parentsItem = new Parents(titles i,SubitemData());
listParent.add(parentsItem);
}
return listParent;
}
private List<Childs> SubitemData() {
List<Childs> listTitle = new ArrayList<>();
for (int i = 0; i < listTitle.size();i ){
Childs childs = new Childs(subtitles i);
listTitle.add(childs);
}
return listTitle;
}
Здесь введенные данные не отображаются в RecyclerView
. Если в классе есть функция, которую, по вашему мнению, невозможно понять, вы можете проверить полный код на моем github: мой проект github
Я немного заканчиваю для проекта выше, я все еще не понимаю, как извлекать данные, а затем отображать их с помощью цикла, я все еще застрял в состоянии for
цикла.
Ответ №1:
Это не сработает, так как в обоих ваших методах вы делаете это:
private List<Parents> ItemData() {
List<Parents> listParent = new ArrayList<>();
for(int i = 0; i < listParent.size();i ){
...
}
return listParent;
}
private List<Childs> SubitemData() {
List<Childs> listTitle = new ArrayList<>();
for (int i = 0; i < listTitle.size();i ){
...
}
return listTitle;
}
Обратите внимание, что вы создаете ArrayList
via ArrayList(), который имеет начальную емкость 10, но размер / количество элементов 0, затем вы пытаетесь выполнить итерацию по пустому списку. Цикл for никогда не будет выполняться как ArrayList#size()
возвращающий значение 0.
Вы бы хотели изменить свои циклы for, чтобы вместо этого сделать что-то вроде:
private List<Parents> ItemData() {
List<Parents> listParent = new ArrayList<>();
for(int i = 0; i < 10; i ){
...
}
return listParent;
}
private List<Childs> SubitemData() {
List<Childs> listTitle = new ArrayList<>();
for (int i = 0; i < 10; i ){
...
}
return listTitle;
}
Обратите внимание, что я удалил вызовы ArrayList#size()
и вместо этого использовал постоянное значение, например 10 или любое другое, которое вы хотите.
Комментарии:
1. из вашего ответа я хочу спросить, как функция цикла for может хранить данные в соответствии с вводом? поскольку из логики, которую я получил, класс list будет хранить данные через
getStringExtra
функцию, поэтому я беру значение list для условия цикла и сохраняю переменную изgetStringExtra
2. Я не уверен в вашем вопросе, ваш getExtra просто возвращает строку в вашем примере… какова цель этой строки? Строка не является списком, она может быть преобразована в список с помощью чего-то значимого, например, пробела или каждой буквы и т. Д
3. Извините, я новичок, поэтому я не до конца понимаю это, но в целом я понимаю концепцию