Sugerencias para la construcción de un control TreeView en AndroidSugerencias para la construcción de un control TreeView en Android
Respuesta
El ExpandableListView es probablemente lo más parecido existente. Tenga en cuenta, sin embargo, que podría ser difícil para un usuario engordar una vista de árbol.
Creé un treeview
propio que admite n niveles. Es fácil de usar en pantallas táctiles, especialmente en dispositivos con pantalla más grande. Usé una clase que se extiende ListviewAdapter
y creé mi propio listitem
. los elementos saben en qué nivel están y heredan el expandstate
de sus padres (al recordar su propio estado). Este árbol es bastante rápido hasta miles de elementos.
Editar: agregó el código, pero la forma en que escribí en el comentario, no será muy útil, porque es muy cercano a mis propias necesidades.
package de.supinfo.FISDroid;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.PaintDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Bitmap mIcon1;
private int active_view;
private int last_path;
public String[][] values = new String[0][];
public EfficientAdapter(Context context, String[][] str_arr_values, int int_active_view) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
values = str_arr_values;
active_view = int_active_view;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
int padding = 0;
// int selfstate = Integer.parseInt(values[position][4].trim());
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.xml.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text_view);
holder.icon = (ImageView) convertView.findViewById(R.id.img_view);
holder.expanded = (ImageView) convertView.findViewById(R.id.ImageView01);
holder.llout = (LinearLayout) convertView.findViewById(R.id.list_item_icon_text);
holder.docs = (TextView) convertView.findViewById(R.id.doc_count);
holder.prun = (ImageView) convertView.findViewById(R.id.prun);
holder.coord = (ImageView) convertView.findViewById(R.id.coord);
holder.button = (Button) convertView.findViewById(R.id.button);
holder.button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
main.tabHost.setCurrentTab(2);
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
String text = values[position][0];
String docs = values[position][11];
if (!docs.equals("0")) {
// TODO
// Anzeige das Dokumente vorhanden sind, eventuell Anzahl
holder.docs.setText(docs);
holder.docs.setVisibility(View.VISIBLE);
} else {
holder.docs.setVisibility(View.INVISIBLE);
}
holder.coord.setVisibility(values[position][12].equals("") || values[position][12].equals("0") || values[position][12].equals("0.0") ? View.INVISIBLE : View.VISIBLE);
holder.prun.setVisibility(values[position][14].equals("") ? View.INVISIBLE : View.VISIBLE);
holder.text.setText(text);
holder.text.setTextSize(GlobalVars.Style.TextSize);
if (position == active_view) {
holder.text.setTextColor(R.color.headline_font);
PaintDrawable pd = new PaintDrawable(Color.RED);
holder.llout.setBackgroundDrawable(pd);
holder.text.setSingleLine(false);
holder.button.setVisibility(values[position][1].equals("-1") ? View.GONE : View.VISIBLE);
} else {
holder.text.setTextColor(R.color.headline_font);
PaintDrawable pd = new PaintDrawable(Color.TRANSPARENT);
holder.llout.setBackgroundDrawable(pd);
holder.text.setSingleLine(true);
holder.button.setVisibility(View.GONE);
}
int i = Integer.parseInt(values[position][5].trim());
mIcon1 = GlobalHelper.GetIcon(i);
holder.icon.setImageBitmap(mIcon1);
if (values[position][8].equals("-1")) {
holder.expanded.setVisibility(View.VISIBLE);
holder.expanded.setImageResource(android.R.drawable.ic_input_add);
} else if (values[position][8].equals("0")) {
holder.expanded.setVisibility(View.INVISIBLE);
} else if (values[position][8].equals("1")) {
holder.expanded.setVisibility(View.VISIBLE);
if (values[position][9].equals("1")) {
holder.expanded.setImageResource(android.R.drawable.ic_menu_revert);
} else {
holder.expanded.setImageResource(android.R.drawable.ic_input_add);
}
}
padding = Integer.parseInt(values[position][7].trim()) * 24;
convertView.setPadding(padding, 5, 5, 5);
return convertView;
}
static class ViewHolder {
LinearLayout llout;
TextView text;
ImageView icon;
ImageView expanded;
ImageView coord;
ImageView prun;
TextView docs;
Button button;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return values.length;
}
public String[] getValues(int position) {
return values[position];
}
public String getValue(int position) {
return values[position][0];
}
public String getDatid(int position) {
return values[position][1];
}
public String getPath(int position) {
return values[position][2];
}
public String getParent(int position) {
return values[position][3];
}
public void set_active_view() {
active_view = GlobalVars.cn.index;
}
public int get_active_view() {
return active_view;
}
public void set_last_path(int position) {
last_path = position;
}
public int get_last_path() {
return last_path;
}
}
Editar: se ha añadido el xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/list_item_icon_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="@color/tree_normal_back"
android:padding="1dip"
android:orientation="horizontal"
android:layout_width="fill_parent">
<LinearLayout
android:id="@+id/plusminus"
android:layout_height="48dip"
android:layout_width="24dip"
android:gravity="right|center_vertical">
<ImageView
android:id="@+id/ImageView01"
android:layout_height="24dip"
android:layout_width="24dip"/>
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_height="48dip"
android:layout_width="48dip"
android:orientation="horizontal"
android:paddingLeft="4dip">
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_height="48dip" android:orientation="vertical" android:layout_width="16dip">
<TextView
android:text="0"
android:id="@+id/doc_count"
android:textColorHighlight="@color/headline_font"
android:layout_gravity="center_vertical"
android:textColor="@color/black"
android:textSize="12dip"
android:layout_margin="0dip"
android:padding="0dip"
android:paddingTop="0dip"
android:gravity="center_vertical|center_horizontal"
android:background="@drawable/ico_24_paperclip"
android:textStyle="normal" android:layout_height="16dip" android:layout_width="16dip">
</TextView>
<ImageView
android:id="@+id/prun"
android:layout_gravity="center_vertical"
android:layout_height="16dip"
android:layout_width="16dip" android:background="@drawable/ico_24_prun"/>
<ImageView
android:id="@+id/coord"
android:layout_gravity="center_vertical"
android:layout_height="16dip"
android:layout_width="16dip" android:background="@drawable/ico_24_coord"/>
</LinearLayout>
<ImageView
android:id="@+id/img_view"
android:layout_gravity="center_vertical"
android:layout_height="24dip"
android:layout_width="24dip" />
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tabs_edit"
android:focusable="false"
android:visibility="gone">
</Button>
<TextView
android:layout_gravity="center_vertical"
android:padding="2dip"
android:marqueeRepeatLimit="2"
android:layout_width="wrap_content"
android:textSize="22dip"
android:textColor="@color/tree_normal_font"
android:id="@+id/text_view"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
que aquí hay una solución que nuestra empresa de código abierto como una biblioteca (de manera muy fácil de reutilizar):
no es posible hacer dicho árbol sin bibliotecas externas pero con herramientas nativas de Android? – Sergey
Puede utilizar esta biblioteca: https://github.com/bmelnychuk/AndroidTreeView para obtener la vista de árbol requerida. Es un árbol de nivel N donde puedes controlar cada nodo en el árbol.
Uso
1) instalar: compile 'com.github.bmelnychuk:atv:1.2.+'
2) la construcción de vista de árbol:
TreeNode root = TreeNode.root();
TreeNode parent = new TreeNode("node-name");
TreeNode child0 = new TreeNode("child-node-name-1");
TreeNode child1 = new TreeNode("child_node-name-2");
parent.addChildren(child0, child1);
root.addChild(parent);
- 1. WPF ControlTemplate para desplazarse TreeView Control
- 2. ¿Pueden los datos vincular un control TreeView?
- 3. Android Treeview
- 4. Control TreeView en C#, seleccione() y enfoque
- 5. ¿Sugerencias para organizar proyectos Android más grandes?
- 6. ¿Cómo puedo hacer clic con el botón derecho para seleccionar un nodo en un control treeview?
- 7. Crear un control híbrido WPF (TreeView + DataGrid = DataTreeGrid)
- 8. HierarchicalDataTemplates en un TreeView
- 9. Encabezado de columna para un WPF TreeView
- 10. Deshabilitar SelectedImageIndex en Treeview
- 11. Enumerar todos los nodos secundarios de un nodo principal en un control treeview en Visual C#
- 12. Selección múltiple en TreeView
- 13. Ejecutando MStest en control de crucero .NET servidor de construcción
- 14. Sugerencias para un creador de formularios JavaScript
- 15. Personalización de TreeView para permitir la selección múltiple
- 16. cómo aplanar un WPF TreeView
- 17. Sugerencias para la planificación de proyectos?
- 18. WPF: personalizado + - en TreeView
- 19. Control de volumen en la aplicación Android
- 20. ¿Dónde está la propiedad IsSynchronizedWithCurrentItem (o equivalente) para un TreeView?
- 21. Sugerencias para manipular un mapa SVG
- 22. Sugerencias/trucos para limitar un script PHP
- 23. Android NDK - la construcción de TessTwo (Tenedor de Tesseract Herramientas para Android) - NDK-generación falla
- 24. ¿Cómo se puede obtener la imagen que usa Windows 7 para dibujar los nodos principales en un control TreeView?
- 25. Aplicación Skinning para Android con perfiles de construcción Maven
- 26. ¿Cómo creo cuadros de tres estados con un control TreeView en .NET?
- 27. cómo un control invisible diseño en Android
- 28. Construcción formal del gráfico de flujo de control
- 29. ¿Cómo inyectas la configuración específica de construcción en un APK?
- 30. Ant/Ivy para la construcción del proyecto
Nice! ¿Te importaría compartirlo? –
-1 para jactarse. Se ve genial, pero es completamente inútil como respuesta, ya que nos deja completamente solos en cuanto a cómo implementar tal cosa. Todo lo que estás haciendo es mostrar el hecho de que encontraste una respuesta, y también podrías haber dicho "puedo responder a esto" y lo dejé así. –
lo siento, pero el código está muy cerca de mis necesidades, escribí las ideas básicas de cómo resolver el problema, el color del adaptador no será muy útil ... – 2red13