Как добавить новый элемент при нажатии кнопки в базовом адаптере - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь создать что-то, что создает новый элемент ListView при нажатии кнопки, у меня какая-то ошибка, но, поскольку я новичок в этой теме, я не знаю, где.

Я пытался переписать код несколько раз, я пытался использовать notifyDataSetChanged ();- он ничего не пробовал гуглить, глядя на другие темы здесь ... Вот мой MainActivity.java:

public Button btn;
private ListView lv;
private CustomeAdapter customeAdapter;
public ArrayList<EditModel> editModelArrayList;

int populateListMaxNum  =3;
int listNumber = populateListMaxNum;

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

    lv = (ListView) findViewById(R.id.listView);
    btn = (Button) findViewById(R.id.btn);

    editModelArrayList = populateList();
    customeAdapter = new CustomeAdapter(this,editModelArrayList);
    lv.setAdapter(customeAdapter);

    /* TODO activate button */

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           addToList();
            Toast.makeText(getApplicationContext(), "button", Toast.LENGTH_LONG).show();

        }
    });


}

private ArrayList<EditModel> populateList(){ //this part works perfectly

    ArrayList<EditModel> list = new ArrayList<>();

    for(int i = 0; i < populateListMaxNum; i++){
        EditModel editModel = new EditModel();
        //editModel.setEditTextValue(String.valueOf(i));
        list.add(editModel);
    }

    return list;
}
/*TODO make it work = expand */

private void addToList(){  // this part doesn't work nor it doesn't fail

    EditModel editModel = new EditModel();

    editModelArrayList.add(editModel);
    customeAdapter.notifyDataSetChanged();
}

}

Вот мой класс CustomeAdapter.java: открытый класс CustomeAdapter расширяет BaseAdapter {

    private Context context;
    public static ArrayList<EditModel> editModelArrayList;

    public CustomeAdapter(Context context, ArrayList<EditModel> editModelArrayList) {

        this.context = context;
        CustomeAdapter.editModelArrayList = editModelArrayList;
    }

    @Override
    public int getViewTypeCount() {
        return getCount();
    }
    @Override
    public int getItemViewType(int position) {

        return position;
    }

    @Override
    public int getCount() {
        return editModelArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return editModelArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.lv_item, null, true);

            holder.editText = convertView.findViewById(R.id.editid);

            convertView.setTag(holder);
        }else {
            // the getTag returns the viewHolder object set as a tag to the view
            holder = (ViewHolder)convertView.getTag();
        }

        holder.editText.setText(editModelArrayList.get(position).getEditTextValue());

        holder.editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                editModelArrayList.get(position).setEditTextValue(holder.editText.getText().toString());

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }


        });

        return convertView;
    }

    private class ViewHolder {

        protected EditText editText;

    }

}

Я ожидаю создать новый элемент списка (EditText + TextView), но ничего не происходит (кроме сообщения Toast) (после некоторых настроек приложение вылетает из-за ошибки arrayindexoutofboundsexception length = 3 index = 3, но не в этом параметре) здесьНужны все файлы: https://gist.github.com/Atingas/52778a247a78131e5b8cb0239fa30965

1 Ответ

0 голосов
/ 09 ноября 2019

Основной линейный макет в lv_item.xml имеет высоту match_parent. Попробуйте изменить его на wrap_content. Похоже, одна строка занимает весь экран.

...