具有动态数量的EditTexts包含行的ListView

时间:2016-06-08 08:10:10

标签: android listview android-edittext

我们的食堂有一个弹簧网络应用程序。 我正在尝试开发一个Android应用程序,用户将能够使用editText查看所有项目并将其数量放在项目名称前。

我可以使用REST获取响应作为List获取所有项目并显示到listView。 但是我发现将editText放在listView中所有项目的前面会有困难,因为项目数是动态的。

如何创建动态editText并将它们放在listView中以及使用REST接收并存储在List中的项目名称

2 个答案:

答案 0 :(得分:1)

正如Ofek在回答中所说,最合适的方法是使用recyclerView和自定义适配器。

首先,您需要为列表中的单个项目布局,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="60dp"
        android:id="@+id/item_edittext"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/item_label"/>
</LinearLayout>

接下来,您必须创建处理数据的适配器,并且还要侦听文本和焦点的更改:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {

public static final String TAG = "CustomAdapter";
private List<String> labels;

public CustomAdapter(List<String> labels) {
    this.labels = labels;
}

@Override
public int getItemCount() {
    return labels.size();
}

@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
    customViewHolder.label.setText(this.labels.get(i));
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    //inflate layout and create new ViewHolder
    View itemView = LayoutInflater.
            from(viewGroup.getContext()).
            inflate(R.layout.custom_item_layout, viewGroup, false);

    return new CustomViewHolder(itemView);
}

//the viewHolder handles the single items in recylerview
public static class CustomViewHolder extends RecyclerView.ViewHolder {

    protected TextView label;
    protected EditText editText;

    public CustomViewHolder(View v) {
        super(v);
        label =  (TextView) v.findViewById(R.id.item_label);
        editText = (EditText)  v.findViewById(R.id.item_edittext);

        //listen for changes in your editText
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG, s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        //listen for focusChangeEvents
        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override

            //at this point may save changed data
            public void onFocusChange(View v, boolean hasFocus) {
                if(! hasFocus) {
                    Log.d(TAG, getAdapterPosition()+" has lost focus ");
                }
            }
        });
    }
}
}

在您的活动中使用它:

ArrayList<String> labels = new ArrayList<>();
labels.add("label1");
labels.add("label2");
labels.add("label3");
labels.add("label4");
labels.add("label5");


RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
CustomAdapter customAdapter = new CustomAdapter(labels);
recyclerView.setAdapter(customAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true)

答案 1 :(得分:0)

ListView的{​​p> EditTexts组合不好,在我的情况下,我必须与LinearLayout一起迁移到动态填充的垂直ScrollView,以便EditTexts他们表现得很好。如果列表的大小不是太大而且您的视图不是太复杂,那么您应该这样做。否则,我会尝试迁移到RecyclerView,然后看看EditTexts的表现如何,我不知道他们是否会这样做,但我还没有尝试过。

请参阅ScrollView+LinearLayout xml

并查看add Views to LinearLayout programatically

Inflating views from xml