2013-04-26 2 views
1

Я пытаюсь использовать GridView для создания набора кнопок изображения. Я использую список массивов для хранения изображений. Каждый раз, когда изображение назначается кнопке с помощью метода getView(), список массивов изображений уменьшается на единицу.Метод getView() отображает только один ImageButton в GridView

моя проблема в том, что в моей сетке показана только одна кнопка! Я не уверен, что это потому, что метод getView() вызывается более одного раза для каждой кнопки. Если это так, я думаю, массив изображений становится пустым, прежде чем все кнопки будут назначены.

Любая помощь приветствуется. вот мой код

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/gridView1" 
android:layout_width= 'fill_parent' 
android:layout_height= 'fill_parent' 
android:numColumns="auto_fit" 
android:verticalSpacing="5dp" 
android:horizontalSpacing="5dp" 
android:columnWidth="90dp" 
android:stretchMode="columnWidth" 
android:gravity="center"  
/> 

item_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_marginTop="35dp" 
android:orientation="horizontal" 
> 
<ImageButton 
    android:id="@+id/button1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="15dp" 
    /> 
</RelativeLayout> 

Изображения, как рандомизированы к кнопкам, а затем удаляются из списка: assignImag() е метод находится в классе MainActivity и каждый раз вызывается из метода getView() класса адаптера:

public class MainActivity extends Activity { 
ArrayList imgs = new ArrayList(); 
GridView gridView; 
..... 
...... 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    gridView = (GridView) findViewById(R.id.gridView1); 
         gridView.setAdapter(new ButtonAdapter(this)); 
} 


public class ButtonAdapter extends BaseAdapter 
{ 
    private Context context; 
    ImageButton imageButton; 


    public ButtonAdapter(Context c) 
    { 
     context = c; 
    } 

    //---returns the number of images--- 
    public int getCount() { 
     return imgs.size(); 
    } 

    //---returns the ID of an item--- 
    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

public View getView(int position, View convertView, ViewGroup parent) 
    { 
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 
      if (convertView == null) {   
      gridView = new View(context); 
       gridView = inflater.inflate(R.layout.item_layout, null); 
       imageButton = (ImageButton) gridView.findViewById(R.id.button1); 
        // assign image to the button 
     assignImage(imageButton); 

        } else { 
         gridView = (View) convertView; 
          } 
     return gridView; 
    } 

} 
} 

public void assignImage(ImageButton b){ 

    Random generator = new Random(); 
    int index = generator.nextInt(imgs.size()); 
    b.setContentDescription(imgs.get(index).toString()); 
    b.setBackgroundResource(imgs.get(index)); 
       imgs.remove(index); 
} 
} 
+0

Вы пытались путем удаления imgs.remove (индекс); эта строка – Abhi

ответ

0

Изменить адаптер, как это:

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

    // Keep all Images in array 
    public Integer[] mThumbIds = { 
      R.drawable.img1, R.drawable.img2, 
      R.drawable.img3, R.drawable.img4, 
      ----- 
      R.drawable.imgN 
    }; 

    // Constructor 
    public ImageAdapter(Context c){ 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     return mThumbIds.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return mThumbIds[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView = new ImageView(mContext); 
     imageView.setImageResource(mThumbIds[position]); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setLayoutParams(new GridView.LayoutParams(67, 55)); 
     return imageView; 
    } 

} 

Нет необходимости создавать отдельный макет для каждого изображения в GridView

+0

Спасибо за быстрый ответ. Мне нужно использовать случайный генератор, чтобы каждый раз, когда я мог назначать разные изображения кнопкам. Кроме того, мне нужно использовать ImageButton вместо ImageView. – user2324637

+0

К сожалению, я изменил свой код, чтобы использовать приведенный выше код, но у меня по-прежнему возникает проблема, почему функция assignImage() get является ошибкой, потому что список пуст очень быстро ... – user2324637

+0

Hi ABhi, извините, я пропустил ваше сообщение. Да, это работает без этой линии (даже до того, как я задаю вопрос). Проблема в том, что мне нужна эта строка кода, потому что каждое изображение нужно подбирать только по одной кнопке за раз, и это должно быть случайным! – user2324637

Смежные вопросы