Sugerencias para crear un control de árbol en Android
Sugerencias para crear un control de árbol en Android
- Android looping infinito ListView?
- El tipo de escala ImageView no funciona en la actividad de la lista
- ¿Los servicios del sistema no están disponibles para las actividades antes de crear?
- Obtener el ID del elemento ListView seleccionado (datos rellenos con DB de SQLite)
- ¿Cómo actualizar el contenido de ViewPager?
- Custom ListView Android
- Los elementos de listView tienen texto en blanco al utilizar setAdapter en el subproceso de interfaz de usuario
- Obtener iconos de aplicaciones que se ejecutan en el dispositivo
- Cambio de fondo del elemento de vista de lista de Android
- ¿Cómo puedo evitar que el pie de página de ListView se seleccione?
- Xamarin.Forms untappable ListView (eliminar el efecto de rizo de selección)
- Índice de matriz de Android ListView fuera de límites después del filtro
- ListView OnItemClick listner no funciona en fragmento
El ExpandableListView es probablemente la cosa existente más cercana. Tenga en cuenta, sin embargo, que puede ser difícil para un usuario a la grasa dedo una vista de árbol.
He construido una treeview
de mi propio que apoya n niveles. Es fácil de usar en pantallas táctiles, especialmente en dispositivos con pantalla más grande. He utilizado una clase que extiende ListviewAdapter
y creó mi propio listitem
. Los artículos saben en qué nivel están y heredan el expandstate
de sus padres (recordando su propio estado). Este árbol es bastante rápido hasta mil artículos.
Edit: agregó el código, pero la forma en que escribí en el comentario, no será muy útil, porque está muy cerca de 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: agregó 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>
Aquí está una solución que nuestra empresa open-sourced como una biblioteca (muy fácil de reutilizar):
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) install: compile 'com.github.bmelnychuk:atv:1.2.+'
2) crear una vista en á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);
- Picasso: cargar imágenes en widget listview
- Cómo comprobar el archivo existe o no y si no crear un nuevo archivo en sdcard en la tarea asíncrona