簡體   English   中英

如何在GridView(Android)中交換圖像

[英]How to swap images in a GridView (Android)

我正在開發一個滑動拼圖Android應用程序,所以我使用GridView來顯示代表圖塊的16個圖像。 其中一個圖塊將由純白圖像(代表背景)組成。 這個想法是,如果用戶點擊與白色瓷磚相鄰的任何瓷磚,則所選瓷磚和白色瓷磚將切換位置。

我試圖通過將白色圖塊設置為用戶選擇的圖塊來實現此功能,反之亦然。 我在變量masterTilePos中保存了白色瓷磚的位置(從位置15開始),並使用參考R.drawable文件中圖像的ImageAdapter Integer數組,將masterValPos處的圖像設置為所選索引處的圖像,並將所選圖像添加到白色圖塊。 但是,當我運行程序時,磁貼只能在第一次成功切換:之后,它無法正常工作,GridView中的磁貼順序也會被破壞。 我想這可能是因為數組只是指實際的圖像對象,但我不知道該怎么做呢? 我遇到這個問題已經有三天了。 這是我的代碼:

//GRID VIEW

public class MainActivity extends ActionBarActivity { 

int masterTilePos = 15;
GridView gridview;

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

    gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {

 //These methods check if a neighboring tile is white, if there is one,  swap() is called

   if(checkUp(position) || checkDown(position) || checkLeft(position) || checkRight(position)) { 

                swap(position);

            }

        }
    });


}


  public void swap(int pos) {

    ImageAdapter updater = new ImageAdapter(this);

  //This is where I try to switch the images, and seems to be the source of the problem

    int val = updater.mThumbIds[masterTilePos];
    updater.mThumbIds[masterTilePos] = updater.mThumbIds[pos];  
    updater.mThumbIds[pos] = val;

    updater.notifyDataSetChanged();
    gridview.setAdapter(updater);
    gridview.invalidateViews();

    masterTilePos = pos;

  }

}




//IMAGE ADAPTER


public class ImageAdapter extends BaseAdapter {

private Context mContext;


public ImageAdapter(Context c) {

    mContext = c;


}

public int getCount() {

    return mThumbIds.length;
}

public Object getItem(int position) {

    return null;
}

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

// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;

    if (convertView == null) {

        // if it's not recycled, initialize some attributes

        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();

        int width = metrics.widthPixels / 4;
        int height = metrics.heightPixels / 4;


        imageView = new ImageView(mContext);

        imageView.setLayoutParams(new GridView.LayoutParams(width, height));

        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setPadding(1, 1, 1, 1);
    }

    else {

        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    return imageView;
}

// the array containing references to the images

public Integer[] mThumbIds = {


        R.drawable.pic1,
        R.drawable.pic2,
        R.drawable.pic3,
        R.drawable.pic4,
        R.drawable.pic5,
        R.drawable.pic6,
        R.drawable.pic7,
        R.drawable.pic8,
        R.drawable.pic9,
        R.drawable.pic10,
        R.drawable.pic11,
        R.drawable.pic12,
        R.drawable.pic13,
        R.drawable.pic14,
        R.drawable.pic15,
        R.drawable.background


  };

}

任何人都可以幫我解決這個問題,這樣我就能成功切換網格中的圖像嗎? 謝謝。

在onCreate你正在做:

gridview.setAdapter(new ImageAdapter(this));

因此,您創建了適配器,而沒有將其分配給任何變量。 這是錯的!

然后,每次交換你創建新的適配器:

ImageAdapter updater = new ImageAdapter(this);

並且您將其設置為當前適配器:

gridview.setAdapter(updater);

這也是錯誤的。

你必須這樣做:

  1. OnCreate - >創建適配器,將其分配給對象的變量(屬性)
  2. 然后你只需要使用那個變量。

然后,如果遇到問題,請在SWAP方法中調試邏輯。

    //GRID VIEW

public class MainActivity extends ActionBarActivity { 

int masterTilePos = 15;
GridView gridview;
ImageAdapter imageAdapter;

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

    gridview = (GridView) findViewById(R.id.gridview);
    imageAdapter= new ImageAdapter(this);
    gridview.setAdapter(imageAdapter);

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {

 //These methods check if a neighboring tile is white, if there is one,  swap() is called

   if(checkUp(position) || checkDown(position) || checkLeft(position) || checkRight(position)) { 

                swap(position);

            }

        }
    });


}


  public void swap(int pos) {

  //This is where I try to switch the images, and seems to be the source of the problem

    int val = imageAdaptor.mThumbIds[masterTilePos];
    imageAdapter.mThumbIds[masterTilePos] = imageAdapter.mThumbIds[pos];
    imageAdapter.mThumbIds[pos] = val;

    imageAdapter.notifyDataSetChanged();
    gridview.invalidateViews();

    masterTilePos = pos;
  }
}

//IMAGE ADAPTER

public class ImageAdapter extends BaseAdapter {

private Context mContext;

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

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

public Object getItem(int position) {
    return null;
}

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

// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;

    if (convertView == null) {

        // if it's not recycled, initialize some attributes
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();

        int width = metrics.widthPixels / 4;
        int height = metrics.heightPixels / 4;

        imageView = new ImageView(mContext);

        imageView.setLayoutParams(new GridView.LayoutParams(width, height));

        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setPadding(1, 1, 1, 1);
    }

    else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    return imageView;
}

// the array containing references to the images

public Integer[] mThumbIds = {
        R.drawable.pic1,
        R.drawable.pic2,
        R.drawable.pic3,
        R.drawable.pic4,
        R.drawable.pic5,
        R.drawable.pic6,
        R.drawable.pic7,
        R.drawable.pic8,
        R.drawable.pic9,
        R.drawable.pic10,
        R.drawable.pic11,
        R.drawable.pic12,
        R.drawable.pic13,
        R.drawable.pic14,
        R.drawable.pic15,
        R.drawable.background
  };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM