2014-07-18 35 views
1

在這裏我正在研究一個應用程序,我必須使用GridView根據客戶的要求顯示一些圖像。面向GridView的問題

在該GridView中,我一次顯示2行和2列,以便一次可以看到4個圖像。現在,用戶想要做一些更改,並且希望我創建一個EditText,其中他可以輸入數字並根據該數字輸入,GridView應該更改其列和行。

是否有可能,因爲我已經經歷了許多在線示例,我得到的是在運行時更改GridView,但使用固定的預定義行數和列數。但是我沒有發現任何例子,比如在運行時從EditText改變GridView。

和幫助的類型將是可觀的。

+0

使用自定義適配器並在構造函數中傳遞來自用戶的多個圖像參數。用它來顯示n張想要顯示的圖像。 – Setu

+0

其實有一種方法可以解決這個問題。初始化時可以取最大數量的列/行。然後你可以爲這些列/行應用android:visibility =「gone」屬性,你不需要。這樣你就可以實現它。 – VVB

回答

1

正如我在評論中所提到的,您可以使用自定義baseadapter作爲您的gridview,並將圖像的數量作爲適配器類的構造函數中的一個參數。以下是您可以用來實現此目的的代碼段。

定製BaseAdapter

public class Adapter extends BaseAdapter { 

private final Context context; 
private final LayoutInflater inflater; 
private final int numbers; 

public Adapter(Context context, int numberOfImages) { 
    this.context = context; 
    this.numbers = numberOfImages; 
    this.inflater = (LayoutInflater) this.context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

@Override 
public int getCount() { 
    //You need to return the numberOfImages here for 
    //the adapter to determine how many view you need to create. 
    return numbers; 
} 

private class viewHolder { 
    ImageView image; 
    TextView image_desc; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    viewHolder holder; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.grid_item, null); 
     holder = new viewHolder(); 
     holder.image = (ImageView) convertView.findViewById(R.id.image); 
     holder.image_desc = (TextView) convertView 
       .findViewById(R.id.img_desc); 
     convertView.setTag(holder); 
    } 
    holder = (viewHolder) convertView.getTag(); 
    if (position % 2 == 0) { 
     holder.image.setImageResource(R.drawable.ic_action_add_person); 
     holder.image_desc.setText("change"); 
    } 

    return convertView; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

} 

你的主要活動:在此活動中,需要詢問用戶輸入他們希望看到的圖像數量。當用戶沒有輸入值時,我沒有添加任何驗證或錯誤消息,而是捕獲了可能的錯誤並使用它來指定默認值。根據您的要求,您可以在這裏應用其他類型的邏輯。

public class MainActivity extends Activity implements OnClickListener { 

EditText text; 
Button button; 
int number; 
private static final String NUMBER_OF_IMAGES = "numbers"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    text = (EditText) findViewById(R.id.text); 
    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 

    try { 
     number = Integer.parseInt(text.getText().toString()); 

     // if user enters 0 or negative number then the default value is set 
     // to 2 
     if (number < 1) { 
      number = 2; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // if user doesn't enter anything then code will catch 
     // classCastException and assign 2 as default value here 
     number = 2; 
    } 
    // start this intent by putting this number in the bundle 
    Intent i = new Intent(getApplicationContext(), SecondActivity.class); 
    Bundle bundle = new Bundle(); 
    bundle.putInt(NUMBER_OF_IMAGES, number); 
    i.putExtras(bundle); 
    startActivity(i); 
} 
} 

次活動:這是你定義和初始化你的GridView和適配器活動。請確保您從以前的活動中檢索包並檢索用戶輸入的編號。

public class SecondActivity extends Activity { 
GridView grid; 
Adapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.grids); 

    Bundle bundle = getIntent().getExtras(); 
    int numbers = bundle.getInt(MainActivity.NUMBER_OF_IMAGES); 

    grid = (GridView) findViewById(R.id.gridview); 
    // depending upon your requirement you can also add logic here to set 
    // the number of columns based on the number entered by the user 
    setColumns(numbers); 
    adapter = new Adapter(getApplicationContext(), numbers); 
    grid.setAdapter(adapter); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    adapter.notifyDataSetChanged(); 
} 

/** 
* Method to set the number of columns depending upon user input for desired 
* grids. other attributes for the grid view can also be set her such as 
* width, height, background etc. 
* 
* @param number 
*/ 
public void setColumns(int number) { 
    if (number > 0 && number < 10) { 
     grid.setNumColumns(2); 
    } else if (number >= 10 && number < 20) { 
     grid.setNumColumns(4); 
    } else { 
     grid.setNumColumns(5); 
    } 
} 
} 

注:這不是高度優化的性能的代碼,但只是提供了所需的功能可以如何實現的示例。

+0

感謝您寶貴的回覆,我會檢查代碼,並讓您知道發生了什麼 – Devraj

+0

@Devraj:這個答案對您有幫助嗎?如果是這樣,請考慮接受並提升它。 :) – Setu

1

根據ueser輸入的行數和列數,您可以計算出要顯示的項目數量,將很多項目傳遞給適配器並設置列號您可以嘗試gridView.setNumColumns(numColumns);。行數將相應調整。