Как я могу изменить изображение во время выполнения Gridview?

#android

#Android

Вопрос:

У меня есть один GridView с 3 столбцами и 3 строками, я хочу изменить изображение, когда пользователь нажимает на любые два изображения.

например, я нажимаю сначала на изображение строки 1 и столбца 3, а во-вторых, я нажимаю на строку 3 и столбец 2 показать, теперь я хочу изменить эти два изображения, например поменять местами изображение, как это возможно?

 public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    GridView gridView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        gridView = (GridView)findViewById(R.id.gridviewmy);
        gridView.setAdapter(new ImageAdapter(this));
        final ImageAdapter im = new ImageAdapter(this);
        gridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                // TODO Auto-generated method stub
                int i=0; int j=0;
                if( i != 0){
                    j=arg2;
                    System.out.println("First Click " j);
                }else{
                    i=arg2;
                    System.out.println("Second Click " i);
                }
                im.getItem(arg2);
                //im.changeImage();
                Toast.makeText(MainActivity.this, "" arg2, Toast.LENGTH_SHORT).show();
                System.out.println("AdapterView " arg0);
                System.out.println("View " arg1);
                System.out.println("Integer " arg2);
                System.out.println("long " arg3);
            }
        });
    }
}

class ImageAdapter extends BaseAdapter{
    private Context mContext;
    ImageView iView;
    public ImageAdapter(Context c){
        this.mContext = c;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mThumbIds.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        System.out.println("Item Is :-" mThumbIds[position].toString());
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        System.out.println("Geting Id of Item " mThumbIds[position]);
        if(iView != null){
        iView.setImageResource(mThumbIds[0]);
        Toast.makeText(mContext, "Call", Toast.LENGTH_SHORT).show();
        }
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        if( convertView == null){
            iView = new ImageView(mContext);
            iView.setLayoutParams(new GridView.LayoutParams(85, 85));
            iView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            iView.setPadding(8,8,8,8);
        }else{
            iView = (ImageView)convertView;
        }

            iView.setImageResource(mThumbIds[position]);
            return iView;
    }
    private Integer[] mThumbIds = {
            R.drawable.a_bhaibij,   R.drawable.a_dashera,       R.drawable.a_dipawali,
            R.drawable.a_gandhi,    R.drawable.a_holi,          R.drawable.a_indepe,
            R.drawable.a_janmastmi, R.drawable.a_kite,          R.drawable.a_newyear
            };
    public void changeImage(){
            iView.setImageResource(mThumbIds[5]);
    }
}
  

Ответ №1:

Поменять местами изображения в GridView очень просто.Что вам нужно сделать, это

1* Сохраните выбранную позицию, в которой вы хотите выполнить замену.

2* Используя эти два значения, выполните операцию подкачки в массиве mThumbIds.

3* Наконец, вызовите метод notifyDataSetChanged () для объекта адаптера, т.е. im.notifyDataSetChanged();

 public class MainActivity extends Activity {
/** Called when the activity is first created. */
int i=0;
int firstClick,secondClick;
GridView gridView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    gridView = (GridView)findViewById(R.id.gridviewmy);
    gridView.setAdapter(new ImageAdapter(this));
    final ImageAdapter im = new ImageAdapter(this);
    gridView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
            // TODO Auto-generated method stub
            i  ;
            if( i %2!=0){
                firstClick=arg2;
            }else{
                secondClick=arg2;
                Integer help=new Interger(mThumbIds[firstClick]);
                mThumbIds[firstClick]=mThumbIds[secondClick];
                mThumbIds[secondClick]=help;
                notifyDataSetChanged();
                System.out.println("Second Click " i);
            }

        }
    });
}
  

}

 class ImageAdapter extends BaseAdapter{
private Context mContext;
ImageView iView;
public ImageAdapter(Context c){
    this.mContext = c;
}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return mThumbIds.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    System.out.println("Item Is :-" mThumbIds[position].toString());
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    System.out.println("Geting Id of Item " mThumbIds[position]);
    if(iView != null){
    iView.setImageResource(mThumbIds[0]);
    Toast.makeText(mContext, "Call", Toast.LENGTH_SHORT).show();
    }
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    if( convertView == null){
        iView = new ImageView(mContext);
        iView.setLayoutParams(new GridView.LayoutParams(85, 85));
        iView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        iView.setPadding(8,8,8,8);
    }else{
        iView = (ImageView)convertView;
    }

        iView.setImageResource(mThumbIds[position]);
        return iView;
}
private Integer[] mThumbIds = {
        R.drawable.a_bhaibij,   R.drawable.a_dashera,       R.drawable.a_dipawali,
        R.drawable.a_gandhi,    R.drawable.a_holi,          R.drawable.a_indepe,
        R.drawable.a_janmastmi, R.drawable.a_kite,          R.drawable.a_newyear
        };
  

}

Я думаю, это может решить вашу проблему.

Всего наилучшего.

Комментарии:

1. привет, спасибо, у меня есть один вопрос: я объявляю целочисленный массив mThumbIds в ImageAdapterclass и при попытке MainActivity в это время получаю ошибку, а также notifyDataSetChanged (); получаю ошибку, как ее устранить?

2. в MainActivity используйте im.notifyDataSetChanged(); здесь im является объектом для ImageAdapter

Ответ №2:

Также выполните следующие действия для обновления изображений в виде сетки, чтобы завершить операцию подкачки:

 im.notifyDataSetChanged();
gridView.setAdapter(im);
gridView.invalidateViews()
  

Ответ №3:

notifyDataSetChanged(); у меня не сработало. eclipse выдал ошибку. поэтому вместо поиска реального решения, если оно есть, я просто перезагрузил страницу Java. Конечно, я сохраняю состояние изображений в gridview (адаптере) во внутреннем хранилище в файле с именем graphics. Итак, при перезагрузке страницы Java она перерисовывается с правильными изображениями. Это работает.