我们的食堂有一个弹簧网络应用程序。 我正在尝试开发一个Android应用程序,用户将能够使用editText查看所有项目并将其数量放在项目名称前。
我可以使用REST获取响应作为List获取所有项目并显示到listView。 但是我发现将editText放在listView中所有项目的前面会有困难,因为项目数是动态的。
如何创建动态editText并将它们放在listView中以及使用REST接收并存储在List中的项目名称
答案 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