在我的应用程序中,我必须生成一个包含大量元素的大表单(通常是一个元素和标签+属性(edditext,spinner,checkbox,...))。
当表单包含更多元素(> 20)时,应用程序开始滞后,通过示例打开键盘需要大约1-2秒或滚动速度慢。
我尝试了什么
目前,每个元素都是从xml(带有TextView和另一个组件的LinearLayout)中膨胀并添加到表单布局中。我试图“重复使用”(几乎重新添加)一个元素,但是我得到了一个异常的说法,因为我已经添加到我的表单布局中,因此View已经有了一个有意义的父级。
我尝试在ListView中添加所有元素,以确保重新使用视图。 它工作但不是很好:在这种情况下的问题是,如果我有一个EditText,用户输入一些文本并滚动到列表的底部,我找不到从EditText保存文本的方法所以我会当元素在ListView中再次可见时(用户滚动回我的元素),可以在EditText中添加回来。
问题
您是否知道如何使用大量UI组件但同时保持良好的应用程序性能?您是否认为可以在用户开始滚动之前从EditText获取文本?
谢谢。
答案 0 :(得分:3)
听起来你有某种偏好屏幕。如果是这种情况,请考虑使用PreferenceActivity。如果这不起作用,那么ListView
具有重用布局的内置方法呢?如果这些选项都不起作用,您可以创建自己的 ViewAdapter ,其工作方式与ListView
非常相似。只需创建一个类 - 例如MyViewAdapter
。它应该采用参数来帮助配置它的外观 - 比如标签文本和其他元素是什么:
public class MyViewAdapter {
public static enum InputType {
editor, spinner, checkbox
};
private CharSequence labelText;
private InputType input;
public MyViewAdapter(CharSequence text, InputType inputType) {
this.labelText = text;
this.input = inputType;
}
}
至于了解EditText
中的文字内容 - 只需使用TextWatcher来收听文字的更改。虽然您可以在滚动回调之前和之后获取,但它需要入侵内置的ScrollView
。此示例将添加到以下代码中。
接下来,添加一个名为getView(Context)
的方法,如下所示:
public View getView(Context context) {
//here is where you inflate your view. For example:
LinearLayout ll = new LinearLayout(context);
ll.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
ll.setOrientation(LinearLayout.VERTICAL);
TextView tv = new TextView(context);
tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
tv.setText(labelText);
ll.addView(tv);
switch (input) {
case (InputType.spinner) : {
//TODO (see editor example)
break;
}
case (InputType.checkbox) : {
//TODO (see editor example)
break;
}
default ://default to editor
case (InputType.editor) : {
EditText et = new EditText(context);
et.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
ll.addView(et);
break;
}
}
return ll;
}
最后,要使用此ViewAdapter,请在主要活动中创建它们:
List<MyViewAdapter> adapters = new ArrayList<MyViewAdapter>();//easy way to manage these.
//for each adapter, do something like:
adapters.add(new MyViewAdapter("myText:", InputType.editor));
然后,为了膨胀视图,请执行:
//Let's say your Main View is a LinearLayout called myView.
for (MyViewAdapter adapter : adapters) {
myView.addView(adapter.getView(context));
}