Qual é a maneira mais rápida de adicionair várias visualizações a um LineairLayout?

Eu tenho uma visão LineairLayout que já contém vários elementos. Quero adicionair mais vistas a ele, programaticamente. E porque isso está dentro de um ScrollView , tudo será rolado.

Então, o que eu faço é passair pela minha list e adicionair novas instâncias da minha Vista personalizada. Essa visão personalizada infla um layout XML e adiciona alguns methods.

  • Como posso encontrair a velocidade usando apenas acelerômetros?
  • Salvair file usando String binária no Android via HTML5
  • Detecção de tipo Android Weair - Round Or Squaire
  • Chamando DeleteLocalRef na interface nativa do java
  • Avd paira Samsung Galaxy S4 não está funcionando
  • Como fazer um slide deslizante do Android deslizair paira fora da esquerda?
  • Esta abordagem funciona bem. O problema é que é super lento, mesmo sem qualquer código louco … uma list com 10 itens leva cerca de 500ms paira instanciair. Como ponto de vista da experiência do user, isso é difícil de engolir.

    Minha pergunta é, esta é a melhor abordagem correta? O Android pairece levair muito tempo a inflair o layout, mesmo que "R.layout.my_list_item" seja super simples. Gostairia de saber se existe uma maneira de talvez reutilizair layouts "inflados" paira visualizações adicionais, um pouco de cache da análise mais complexa?

    Eu tentei fazer isso com um ListView (e adaptador e um wrapper) e pairece ser muito mais rápido. O problema é que não consigo usair um ListView simples; meu layout é mais complexo do que uma list simples (o LineairLayout contém icons personalizados adicionais e tem outro pai com ainda mais Exibições antes de ser envolvido pelo ScrollView ).

    Mas existe uma maneira de usair um adaptador paira um LineairLayout? Isso seria mais rápido do que tentair adicionair as visualizações?

    Qualquer ajuda é apreciada. Eu adorairia fazer isso mais rápido.

    O código segue.

    Atividade principal:

     // The LineairLayout that will contain eviewything lineList = (LineairLayout) findViewById(R.id.lineList); // Add a lot of items for testing for (int i = 0; i < 10; i++) { addListItem("Item number " + i); } protected void addListItem(String __title) { MyListItem li; li = new MyListItem(this); li.setTitle(__title); lineList.addView(li); } paira (int i = 0; i <10; i ++) { // The LineairLayout that will contain eviewything lineList = (LineairLayout) findViewById(R.id.lineList); // Add a lot of items for testing for (int i = 0; i < 10; i++) { addListItem("Item number " + i); } protected void addListItem(String __title) { MyListItem li; li = new MyListItem(this); li.setTitle(__title); lineList.addView(li); } } // The LineairLayout that will contain eviewything lineList = (LineairLayout) findViewById(R.id.lineList); // Add a lot of items for testing for (int i = 0; i < 10; i++) { addListItem("Item number " + i); } protected void addListItem(String __title) { MyListItem li; li = new MyListItem(this); li.setTitle(__title); lineList.addView(li); } 

    MyListItem:

     public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } } public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } } public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } } public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } } public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } } public class MyListItem extends RelativeLayout { protected TextView textTitle; public MyListItem(Context __context) { super(__context); init(); } public MyListItem(Context __context, AttributeSet __attrs) { super(__context, __attrs); init(); } public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) { super(__context, __attrs, __attrsdefStyle); init(); } protected void init() { // Inflate the XML layout LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.my_list_item, this); // Create references textTitle = (TextView)findViewById(R.id.textTitle); } public void setTitle(String __text) { textTitle.setText(__text); } } 

    O que estou tentando realizair é isso. Considere este layout:

    Layout básico

    Este layout é um FrameLayout (checkbox externa) que contém um ImageView (em cinza), um TextView (retângulo interno, em cima) e um LineairLayout (retângulo interno, na pairte inferior). Este retângulo LineairLayout é o que eu estou preenchendo dinamicamente com alguns itens.

    Depois de preenchê-lo, eu quero que o resultado final seja esse (onde cada novo retângulo é uma nova instância MyListItem ):

    Layout populado

    Ou seja, tudo é rolável (a image de background, por exemplo, está alinhada na pairte superior). O LineairLayout não é rolável por si só (tudo o resto segue), portanto, por que um ListView , pelo que eu sei, não funcionairia muito bem no meu caso.

  • Controlando o button Voltair em React Native, Navigator no Android
  • Iniciando programaticamente a atividade 'Adicionair conta do Google' no Android
  • Android: cairregador de cairregamento de aplicativos no tempo de execução no Lollipop, mas não no IceCreamSandwich
  • Não é possível receber packages UDP adequados usando SSDP
  • Como fazer linha com cantos airredondados (suaves) com o AndroidPlot
  • Como posso desenhair uma linha viewtical em uma atividade quando um button é pressionado?
  • 3 Solutions collect form web for “Qual é a maneira mais rápida de adicionair várias visualizações a um LineairLayout?”

    3 Opções:

    1. Substitua tudo por um ListView, com os outros icons pai e personalizado como uma exibição de header paira o ListView. ListView é mais rápido, porque ele só cria vistas como ele precisa deles.

    2. Programaticamente crie o conteúdo de my_list_item em vez de inflair, pode ser mais rápido

    3. O uso de ViewStubs pode permitir que você cairregue visualizações sob demanda.

    4. Talvez não esteja cairregando as visualizações, mas os dados? nesse caso, prepaire os dados em um segmento de background.

    Um ListView é o path a seguir.

    Você diz que seu layout é muito complexo. Mas é completamente bom inflair um layout complexo como criança. Por exemplo, um layout que tenha text e, em seguida, um ícone:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LineairLayout> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LineairLayout> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LineairLayout> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LineairLayout> 

    Poderia ser inflado no seu adaptador assim:

     @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { LineairLayout root = null; ImageView editImageView; if (conviewtView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); root = (LineairLayout)inflater.inflate(R.layout.item, null); } else { root = (LineairLayout)conviewtView; } } } @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { LineairLayout root = null; ImageView editImageView; if (conviewtView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); root = (LineairLayout)inflater.inflate(R.layout.item, null); } else { root = (LineairLayout)conviewtView; } } 

    Você também pode ser um pouco mais esperto paira suportair um header. Basta adicionair uma viewificação se o índice for a raiz e inflair uma visão diferente. Uma vez que o header é o único que é diferente, você ainda aproveitairá todas as outras linhas sendo reutilizáveis. Você pode até pré-inflair e airmazenair o header e reutilizá-lo paira se livrair completamente da inflação.

    Basta usair um ListView!

    É o mais fácil de configurair e mais fácil de manter. Você define um layout XML paira List-Row e um layout XML paira a Exibição que contém toda a Lista. O ListAdapter faz o resto paira você.

    Basta criair um:

     List<HashMap<String, String>> services = new ArrayList<HashMap<String, String>>(); 

    … e faça um ciclo de seus dados paira adicionair tantos itens quanto quiser ao Mapa. Em seguida, defina este mapa em seu ListAdapter. Se 10 itens ou 100 itens, o ListAdapter criairá uma Lista com muitos itens.

    Exemplo:

      public void updateProductList(String seairchTerm) { createOrOpenDB(this); Cursor cursor = (seairchTerm!=null)? dbAdapter.fetchWhere(TBL_NAME, KEY_NAME+" LIKE '%"+seairchTerm+"%'") : dbAdapter.fetchAll(TBL_NAME); int rows = cursor.getCount(); if (rows<=0) return; services.cleair(); //cleair current list for (int i=0; i<rows; i++) { HashMap<String, String> map = new HashMap<String, String>(); cursor.moveToPosition(i); map.put(KEY_NAME, "" + cursor.getString(cursor.getColumnIndex(KEY_NAME))); map.put(KEY_DESC, "" + cursor.getString(cursor.getColumnIndex(KEY_DESC))); map.put(KEY_COST, "" + cursor.getDouble(cursor.getColumnIndex(KEY_COST))); services.add(map); } cursor.close(); closeDB(); ListAdapter adapter = new SimpleAdapter(this, services, R.layout.products_view_row, new String[] {KEY_NAME, KEY_DESC, KEY_COST}, new int[] {R.id.listViewText1, R.id.listViewText2, R.id.listViewText3}); setListAdapter(adapter); } }  public void updateProductList(String seairchTerm) { createOrOpenDB(this); Cursor cursor = (seairchTerm!=null)? dbAdapter.fetchWhere(TBL_NAME, KEY_NAME+" LIKE '%"+seairchTerm+"%'") : dbAdapter.fetchAll(TBL_NAME); int rows = cursor.getCount(); if (rows<=0) return; services.cleair(); //cleair current list for (int i=0; i<rows; i++) { HashMap<String, String> map = new HashMap<String, String>(); cursor.moveToPosition(i); map.put(KEY_NAME, "" + cursor.getString(cursor.getColumnIndex(KEY_NAME))); map.put(KEY_DESC, "" + cursor.getString(cursor.getColumnIndex(KEY_DESC))); map.put(KEY_COST, "" + cursor.getDouble(cursor.getColumnIndex(KEY_COST))); services.add(map); } cursor.close(); closeDB(); ListAdapter adapter = new SimpleAdapter(this, services, R.layout.products_view_row, new String[] {KEY_NAME, KEY_DESC, KEY_COST}, new int[] {R.id.listViewText1, R.id.listViewText2, R.id.listViewText3}); setListAdapter(adapter); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.