簡體   English   中英

更新GridView

[英]Updating a GridView

單擊某個項目時,我需要更新自己的gridView。 我已經做了很多嘗試,但是沒有任何效果。 我的活動有以下代碼:

public class GameActivity extends AppCompatActivity implements IGameView{

public GridGame _gridGame = new GridGame();
public GamePresenter _presenter = new GamePresenter(this, _gridGame);
public ImageAdapter _imageAdapter = new ImageAdapter(this, _gridGame);

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_help) {
        Intent intent = new Intent(this, HelpActivity.class);
        startActivity(intent);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

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

    final Context context = this;

    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(_imageAdapter);

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            _presenter.addPawn(position);
            _imageAdapter.update(position, _presenter.actualPlayer);
            Toast.makeText(context, "" + position,Toast.LENGTH_SHORT).show();
        }
    });
}

和imageAdapter的代碼:

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private GridGame _gridGame;
public ImageAdapter(Context c, GridGame grid) {
    mContext = c;
    _gridGame = grid;
}

public int getCount() {
    return grid.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
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new ViewGroup.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    } else {
        imageView = (ImageView) convertView;
    }

    setGrid();

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

private Integer[] grid = new Integer[42];

public void setGrid() {
    for(int i = 0; i < 42; i++){
        grid[i] = R.drawable.square;
    }
}

public void update(int id, int player){
    grid[id] = R.drawable.ic_notifications_black_24dp;
}

當我單擊一個正方形(gridview上的項目)時,我希望該視圖更新一個顯示其他圖像而不是正方形。 當我在ImageAdapter上調用update方法但視圖未更新時,更新已完成。

首先,您需要修復為適配器返回所需數據的方法,以將項目對象標識為

// return the new data from sourcein case of update
public Object getItem(int position) {
    return grid[position];
}

// don't send 0 always
public long getItemId(int position) {
    return position;
}

// invoke notifyDataSetChanged(); when there is a change in data source
public void update(int id, int player){
    grid[id] = R.drawable.ic_notifications_black_24dp;
    notifyDataSetChanged();
}

您需要通知適配器數據元素已更改。 試試這個update()方法:

public void update(int id, int player){
    grid[id] = R.drawable.ic_notifications_black_24dp;
    notifyDataSetChanged();
}

好的,我發現了問題,我在getView(int position, View convertView, ViewGroup parent);設置了網格getView(int position, View convertView, ViewGroup parent); 但應在構造函數中設置。 問題在於,每當我單擊一個項目時,它都會重置網格中的值,因此該值沒有更改。

暫無
暫無

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

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