如何在列表视图中动态添加或删除编辑文本

Posted

技术标签:

【中文标题】如何在列表视图中动态添加或删除编辑文本【英文标题】:How to make dynamically add or remove edit text in listview 【发布时间】:2016-02-13 20:42:32 【问题描述】:
public class SoloPlayActivity extends BaseActivity implements View.OnClickListener
private ListView case_list;
private RelativeLayout add_case;
private TextView num_case_textview;
private Button start_button;
ArrayList<ItemSoloplayCase> caseArrayList;
AdapterSoloplay adapter;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_solo_play);
    initView();
    //처음에는 경우의 수가 아무것도 없음
    num_case_textview.setText("0");
    caseArrayList = new ArrayList<ItemSoloplayCase>();
    adapter = new AdapterSoloplay(this, caseArrayList, num_case_textview);
    case_list.setAdapter(adapter);


private void initView()
    add_case = (RelativeLayout)findViewById(R.id.add_case);
    add_case.setOnClickListener(this);
    num_case_textview = (TextView)findViewById(R.id.num_case);
    start_button = (Button)findViewById(R.id.game_start);
    start_button.setOnClickListener(this);
    case_list = (ListView)findViewById(R.id.case_list);
    //리스트뷰에서 포커스를 잃지 않도록 한다.
    case_list.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

@Override
protected String getActionbarTitle() 
    return getString(R.string.solo_play_name);

//뒤로가기가 눌렸을때 추가한 경우의 수가 있을경우에만 다이얼로그 띄우고 경우의수가 비었다면 그냥 종료
@Override
public void onBackPressed() 
    if (!caseArrayList.isEmpty()) 
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("입력한 경우의 수는 모두 사라집니다. 정말로 닫겠습니까?")
                .setCancelable(false)
                .setPositiveButton("확인", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialog, int which) 
                        SoloPlayActivity.this.finish();
                    
                )
                .setNegativeButton("취소", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialog, int which) 
                        dialog.cancel();
                    
                );
        AlertDialog alert = builder.create();
        alert.show();
    
    else
        SoloPlayActivity.this.finish();


@Override
public void onClick(View v) 
    switch (v.getId())
        case R.id.game_start:
            Toast.makeText(getApplicationContext(), "게임시작 버튼 누름", Toast.LENGTH_SHORT);
            break;
        case R.id.add_case:
            //경우의수 추가
            ItemSoloplayCase additem = new ItemSoloplayCase();
            caseArrayList.add(additem);
            num_case_textview.setText(Integer.toString(caseArrayList.size()));
            adapter.notifyDataSetChanged();
            break;
    

活动文件。

适配器文件。

public class AdapterSoloplay extends BaseAdapter 
private Context context;
private ArrayList<ItemSoloplayCase> caselist;
private TextView num_case;
//순서 갱신 오류, 해당 지운 에디트가 지워지지 않음
public AdapterSoloplay(Context context, ArrayList<ItemSoloplayCase> caselist, TextView num_case) 
    this.context = context;
    this.caselist = caselist;
    this.num_case = num_case;


@Override
public int getCount() 
    return caselist.size();


@Override
public Object getItem(int position) 
    return caselist.get(position);


@Override
public long getItemId(int position) 
    return position;


@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    final Viewholder holder;
    if (convertView == null)
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_case_input, parent, false);
        holder = new Viewholder();
        holder.order = (TextView) convertView.findViewById(R.id.order_num);
        holder.editText = (EditText)convertView.findViewById(R.id.input_case);
        holder.button_clear = (ImageButton)convertView.findViewById(R.id.remove_case);
        //순서는 현재 크기만큼
        holder.order.setText(Integer.toString(getCount()));

        convertView.setTag(holder);
    
    else
        holder = (Viewholder)convertView.getTag();


    //클리어를 눌럿을때 제거하고 순서를 재정렬하고 갱신시킨다
    holder.button_clear.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            ItemSoloplayCase item = (ItemSoloplayCase)getItem(position);
            item = null;
            caselist.remove(position);
            notifyDataSetChanged();
            num_case.setText(Integer.toString(caselist.size()));
        
    );

    return convertView;

class Viewholder 
    private EditText editText;
    private TextView order;
    private ImageButton button_clear;

我想在列表视图中动态添加或删除编辑文本。 ' 像图像。 enter image description here 如果我想删除第二个列表(在此图像中,b)但它删除了最后一个数据(在此图像中,d)。然后我单击添加按钮,它会生成最后一个数据..(在此图像中,编辑文本值 d)。

以上是我的代码。帮助。

请帮帮我。

【问题讨论】:

【参考方案1】:

向 listview rows xml 文件添加一个线性布局: 要动态添加 EditText 到这个布局,试试这个:

EditText editText = new EditText(context);
editText.setHint(hint);
editText.requestFocus();
editText.setSelection(editText.getText().length());
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
linearlayout.addview(editText);

【讨论】:

感谢您的评论。我已经制作了列表视图行 xml 文件。喜欢 R.layout.item_case_input 文件。

以上是关于如何在列表视图中动态添加或删除编辑文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中实用地添加和删除布局?

vue动态添加删除富文本(wangEditor)

SENCHA:如何通过单击 SENCHA touch 中的添加/删除按钮动态添加/删除文本字段

如何在android中动态添加edittext?

如何通过相机或图库动态添加图像?

如何在jira中动态或使用插件添加新值以选择列表字段