2013-09-26 92 views
3

這是我的第一個問題。 我正在開發一個Android應用程序,我使用GridView作爲DataGrid。 我有一些網格有7或8列,我需要根據其內容使gridview的列具有不同的寬度。 我檢查所有帖子,但找不到解決方案。 我現在正在做的是設置每個視圖的LayoutParams,計算一個固定寬度,併爲每個視圖選擇一個百分比,視圖獲得正確的寬度,但第二個視圖的文本顯示在第一個視圖上等等。 我所有的視圖都是TextView或EditText。Android GridView與不同大小的列

我會爲您提供任何幫助。 非常感謝您提前!

馬克西

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final int row = GetRow(position); 
    View field = null; 
    String text = ""; 
// convertView = grid.getChildAt(position); 
    /*f (grid.getChildAt(position) != null) { 
     if (null == convertView) { 
      return grid.getChildAt(position); 
     } else { 
      convertView = null; 
     } 
    }*/ 
    int width = 0; 
    Point size = new Point(); 
    ((Activity) context).getWindowManager().getDefaultDisplay().getSize(size); 
    width = weights[GetCol(position)] * (size.x - 50)/100; 

    if (row == 0){ 
     text = localfieldstitles[position]; 
     if (convertView != null){ 
      field = (TextView) convertView; 
     } else { 
      field = new TextView(context); 
     } 

     ((TextView)field).setText(text); 
     field.setBackgroundResource(R.drawable.buttonblue); 
     ((TextView)field).setTextAppearance(context, android.R.style.TextAppearance_DeviceDefault_Medium); 
     LayoutParams params = new GridView.LayoutParams(width, LayoutParams.MATCH_PARENT); 
     field.setLayoutParams(params); 
    } else { 
    // Get our text for position 
     final int col = GetCol(position); 
     try { 
      gridData.absolute(row); 
      if (gridData.getString(remotefields[col]) != null) { 
       text = gridData.getString(remotefields[col]); 
      } else { 
       text = ""; 
      } 

      if (convertView != null) { 
       field = convertView; 
       if (convertView instanceof EditText) { 
        ((EditText) field).setText(text); 
       } else { 
        ((TextView) field).setText(text); 
       } 
      } else { 
       if (editable[col].equalsIgnoreCase("T")) { 
        field = new EditText(context); 
        ((EditText) field).setText(text); 
        ((EditText) field).setInputType(fieldtypes[col]); 
       } else { 
        field = new TextView(context); 
        ((TextView) field).setText(text); 
       } 
      } 
      if (editable[col].equalsIgnoreCase("T")) { 
       ((EditText)field).setSingleLine(); 
       ((EditText)field).setOnEditorActionListener(
         new EditText.OnEditorActionListener() { 
        @Override 
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
         if (actionId == EditorInfo.IME_ACTION_DONE || 
           actionId == EditorInfo.IME_ACTION_NEXT) { 
           try { 
            if (!isFindColumn(col)) { 
             gridData.absolute(row); 
             switch (gridData.getMetaData().getColumnType(col)) { 
              case Types.FLOAT: 
               case Types.REAL: 
               case Types.DECIMAL: gridData.updateFloat(localfields[col], Float.parseFloat(v.getText().toString())); break; 
              case Types.DOUBLE: gridData.updateDouble(localfields[col], Double.parseDouble(v.getText().toString())); break; 
              case Types.INTEGER: gridData.updateInt(localfields[col], Integer.parseInt(v.getText().toString())); break; 
              case Types.VARCHAR: 
               case Types.NVARCHAR: 
               case Types.CHAR: gridData.updateString(localfields[col], v.getText().toString()); break;            
             } 
             datachange.fieldChange(localfields[col], v.getText().toString()); 
            } else { 
             findColumn.FINDTEXT = v.getText().toString(); 
             executeSearch(); 
            } 
           } catch (SQLException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
         } 
         return true; // pass on to other listeners. 
        } 


        }); 
        ((EditText)field).setOnFocusChangeListener(new EditText.OnFocusChangeListener() {   

         public void onFocusChange(View v, boolean hasFocus) { 
          if(!hasFocus){ 
           try { 
            if (!isFindColumn(col)) { 
             gridData.absolute(row); 
             switch (gridData.getMetaData().getColumnType(col)) { 
              case Types.FLOAT: 
               case Types.REAL: 
               case Types.DECIMAL: gridData.updateFloat(localfields[col], Float.parseFloat(((TextView)v).getText().toString())); break; 
              case Types.DOUBLE: gridData.updateDouble(localfields[col], Double.parseDouble(((TextView)v).getText().toString())); break; 
              case Types.INTEGER: gridData.updateInt(localfields[col], Integer.parseInt(((TextView)v).getText().toString())); break; 
              case Types.VARCHAR: 
               case Types.NVARCHAR: 
               case Types.CHAR: gridData.updateString(localfields[col], ((TextView)v).getText().toString()); break;            
             } 
             datachange.fieldChange(localfields[col], ((TextView)v).getText().toString()); 
            } /*else { 
             findColumn.FINDTEXT = ((TextView)v).getText().toString(); 
             executeSearch(); 
            } */        
           } catch (SQLException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
          } 
           //do job here owhen Edittext lose focus 
         } 
        }); 
      } 
      LayoutParams params; 
      if (text.equalsIgnoreCase("")) { 
       params = new GridView.LayoutParams(width, 40); 
      } else { 
       params = new GridView.LayoutParams(width, LayoutParams.WRAP_CONTENT); 
      } 
      field.setLayoutParams(params); 

     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    //Finally return the view } 
    return field; 
} 

回答

1

首先告訴我,你如何設置你的GridView?你使用setAdapter方法嗎? 如果你告訴我,我可以幫你,而且我認爲你必須爲此創建CustomAdapter。因此,第一步回答我的問題。

+0

嗨馬吉德,非常感謝你的時間。我有一個從BaseAdapter繼承的自定義適配器。在getView函數中,我設置視圖的LayoutParams,計算寬度,屏幕大小和固定百分比(每列不同)。 另外,當我在網格的第一行(位置0到6)時,我將TextView的背景設置爲Drawable資源以區別於數據字段。 我會更新我的問題併發布我的代碼。 非常感謝你... 關心, 馬克西 – Maxi