2013-04-09 15 views
6

Voglio fare un listview sembra un controllo datagrid in Android.Tutte le colonne sono generate da code-behand che è dinamico.I miei frammenti di codice potrebbero essere compilati con successo ma il listview non viene visualizzato come mi aspettavo.Che cosa non va?Posso inserire una colonna in listview in fase di esecuzione?

@Override 
     public View getView(int position, View convertView, ViewGroup parentView) { 
      ViewHolder holder = null; 
      if (convertView == null) { 
       synchronized (MainActivity.this) { 
        convertView = mInflater.inflate(id_row_layout, null); 
        holder = new ViewHolder(); 

//I had add an textView to the convertView,but it not show 

        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.rLayout); 
        TextView tx = new TextView(context); 
        tx.setText("ads"); 
        layout.addView(tx); 

        MyHScrollView scrollView1 = (MyHScrollView) convertView 
          .findViewById(R.id.horizontalScrollView1); 

        holder.scrollView = scrollView1; 
        holder.txt1 = (TextView) convertView 
          .findViewById(R.id.textView1); 
        holder.txt2 = (TextView) convertView 
          .findViewById(R.id.textView2); 
        holder.txt3 = (TextView) convertView 
          .findViewById(R.id.textView3); 
        holder.txt4 = (TextView) convertView 
          .findViewById(R.id.textView4); 
        holder.txt5 = (TextView) convertView 
          .findViewById(R.id.textView5); 

        MyHScrollView headSrcrollView = (MyHScrollView) mHead 
          .findViewById(R.id.horizontalScrollView1); 
        headSrcrollView 
          .AddOnScrollChangedListener(new OnScrollChangedListenerImp(
            scrollView1)); 

        convertView.setTag(holder); 
        mHolderList.add(holder); 
       } 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.txt1.setText(position + "" + 1); 
      holder.txt2.setText(position + "" + 2); 
      holder.txt3.setText(position + "" + 3); 
      holder.txt4.setText(position + "" + 4); 
      holder.txt5.setText(position + "" + 5); 

      return convertView; 
     } 
+0

Per quanto ne so, se non siamo in grado di aggiungere vista in xml in modo dinamico, non è possibile – Senthil

+0

grazie per la tua risposta, voglio caricare i dati per mostrare come datagrid.i avevo provato la soluzione tablelayout, ma funziona a slow.i devo usare listview ma la mia tabella sqlite è generata da objects.so qualsiasi altra soluzione per questo? – Whistler

risposta

0

Opere per me in ApiDemos con testo aggiuntivoView;

public class List14 extends ListActivity { 

    private static class EfficientAdapter extends BaseAdapter { 
     private LayoutInflater mInflater; 
     private Bitmap mIcon1; 
     private Bitmap mIcon2; 
     private Context context; 

     public EfficientAdapter(Context context) { 
      // Cache the LayoutInflate to avoid asking for a new one each time. 
      mInflater = LayoutInflater.from(context); 
this.context = context; 
      // Icons bound to the rows. 
      mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_1); 
      mIcon2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_2); 
     } 

     /** 
     * The number of items in the list is determined by the number of speeches 
     * in our array. 
     * 
     * @see android.widget.ListAdapter#getCount() 
     */ 
     public int getCount() { 
      return DATA.length; 
     } 

     /** 
     * Since the data comes from an array, just returning the index is 
     * sufficent to get at the data. If we were using a more complex data 
     * structure, we would return whatever object represents one row in the 
     * list. 
     * 
     * @see android.widget.ListAdapter#getItem(int) 
     */ 
     public Object getItem(int position) { 
      return position; 
     } 

     /** 
     * Use the array index as a unique id. 
     * 
     * @see android.widget.ListAdapter#getItemId(int) 
     */ 
     public long getItemId(int position) { 
      return position; 
     } 

     /** 
     * Make a view to hold each row. 
     * 
     * @see android.widget.ListAdapter#getView(int, android.view.View, 
     *  android.view.ViewGroup) 
     */ 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // A ViewHolder keeps references to children views to avoid unneccessary calls 
      // to findViewById() on each row. 
      ViewHolder holder; 

      // When convertView is not null, we can reuse it directly, there is no need 
      // to reinflate it. We only inflate a new View when the convertView supplied 
      // by ListView is null. 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.list_item_icon_text, null); 

       // Creates a ViewHolder and store references to the two children views 
       // we want to bind data to. 
       holder = new ViewHolder(); 
       holder.text = (TextView) convertView.findViewById(R.id.text); 
       holder.icon = (ImageView) convertView.findViewById(R.id.icon); 
       LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.layout); 
       TextView child = new TextView(context); 
       child.setText("CHILD"); 
       layout.addView(child); 

       convertView.setTag(holder); 
      } else { 
       // Get the ViewHolder back to get fast access to the TextView 
       // and the ImageView. 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      // Bind the data efficiently with the holder. 
      holder.text.setText(DATA[position]); 
      holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); 

      return convertView; 
     } 

     static class ViewHolder { 
      TextView text; 
      ImageView icon; 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setListAdapter(new EfficientAdapter(this)); 
    } 

    private static final String[] DATA = { 
      "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", 
      }; 
} 

enter image description here

Controlla la tua statica holder e layouts.

0

È facile avere una colonna in più, basta mostrare e nascondere un elemento per una posizione selezionata. Devi nasconderli una volta che l'elemento non è mostrato.

Infatti, è anche possibile gonfiare un RelativeLayout dall'adattatore, ma questo potrebbe essere più difficile da raggiungere.

Speranza che aiuta

0

Se il layout di file di Riga sarà uguale per ogni riga allora

si può semplicemente aggiungere il numero di elemento (in altre parole la colonna)

al tuo ArrayList (che è responsabile per riempire il listviewadapter) e basta chiamare notifydatasetchanged(true) o adapter.notifyDataSetChanged()

Codice
2
1) In your adapter with Arraylist override the appropriate constructor 
2) In your activity, make your variable data a field (type ArrayList 
3) When you add a location you can use data.add(location) 
4) Then you can call notifyDatasetChanged() on your adapter 

Esempio: http://androidadapternotifiydatasetchanged.blogspot.in/

Problemi correlati