2013-04-09 23 views
6

Chcę, aby widok listy wyglądał jak kontrola datagrid w Androidzie. Wszystkie kolumny są generowane przez kod-behand, który jest dynamiczny. Moje fragmenty kodu mogą być budowane pomyślnie, ale widok listy nie jest wyświetlany zgodnie z oczekiwaniami. Co jest z nim nie tak?Czy mogę wstawić kolumnę w widoku listy w czasie wykonywania?

@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

Z tego co wiem, jeśli nie możemy dodać widok w xml dynamicznie, to nie jest możliwe – Senthil

+0

dzięki za odpowiedzi, chcę, aby załadować dane, aby pokazać jak datagrid.i miał spróbować rozwiązanie tablelayout, ale działa to spowolnić.i trzeba użyć listview, ale moja tabela sqlite jest generowanie przez objects.so jakiekolwiek inne rozwiązanie do tego? – Whistler

Odpowiedz

0

Działa dla mnie w ApiDemos z dodatkowym tekstemView;

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

Sprawdź swoją statyczną holder i layouts.

0

Łatwo mieć dodatkową kolumnę, wystarczy pokazać i ukryć element dla wybranej pozycji. Musisz ukryć je, gdy element nie zostanie pokazany.

W rzeczywistości można również nadmuchać RelativeLayout z adaptera, ale może to być trudniejsze do osiągnięcia.

nadzieję, że pomoże

0

Jeśli twój Row układ pliku będzie taka sama dla każdego wiersza następnie

można po prostu dodać liczbę pozycji (innymi słowy kolumnie)

do swojego ArrayList (który jest odpowiedzialny za wypełnienie listviewadapter) i wystarczy zadzwonić pod numer notifydatasetchanged(true) lub adapter.notifyDataSetChanged()

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 

Przykładowy kod: http://androidadapternotifiydatasetchanged.blogspot.in/

Powiązane problemy