【发布时间】:2014-07-21 20:31:45
【问题描述】:
我有一个带有不会刷新的自定义适配器的 GridView。
在调试器中,我可以看到 getView 在 notifyDataSetChanged 之后没有被调用。
我不知道为什么...我可以看到基础数据正在更改,但 GridView 没有发生任何事情。
我尝试了几种不起作用的解决方案,所以我发布了我认为应该是正确的解决方案(即使它显然不是......)
这是我的主要活动
private GridView grid;
private TileGridAdapter gridAdapter;
private ArrayList<Tile> list;
private GameManager gameManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gameManager = new GameManager(4);
list = (ArrayList<Tile>) gameManager.getTiles();
grid = (GridView) findViewById(R.id.grid);
gridAdapter = new TileGridAdapter(this, list);
grid.setAdapter(gridAdapter);
grid.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
public void onSwipeTop() {
gameManager.move(Direction.Up);
list.clear();
list.addAll(gameManager.getTiles());
gridAdapter.notifyDataSetChanged();
}
public void onSwipeRight() {
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
});
}
还有自定义适配器
public class TileGridAdapter extends ArrayAdapter<Tile> {
Context context;
ArrayList<Tile> tiles;
public TileGridAdapter(Context context, ArrayList<Tile> tiles) {
super(context, R.layout.cell_layout, tiles);
this.context = context;
this.tiles = tiles;
}
@Override
public int getCount() {
return tiles.size();
}
@Override
public Tile getItem(int position) {
return tiles.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
view = inflater.inflate(R.layout.cell_layout, parent, false);
Tile tile = tiles.get(position);
TextView tv = (TextView) view.findViewById(R.id.cell_view);
if (tile != null) {
tv.setText(String.valueOf(tile.getValue()));
}
}
return view;
}
}
【问题讨论】:
-
您确定 GameManager.getTitles() 实际上返回的是您认为的列表,还是返回相同的列表(因此,显示不会改变)?
-
列表不同。我运行调试器并观察了tiles数组,它正在更新
-
哦,原因如下:您正在清除您创建的列表,而不是实际的适配器。尝试调用 gridAdapter.clear();然后 gridAdapter.addAll(gameManager.getTitles());
-
不。现在试了一遍又一遍。我单独尝试了这两条新线,而这两条线与前两条线(list.XXX)一起尝试。我还覆盖了适配器的 addAll ,但仍然没有。在这两种情况下,我都看到了瓷砖数组正在改变,但视图却没有
-
使用调试器查看适配器中的列表是否实际上正在更改,并且与您正在查看的引用相同。
标签: android gridview android-arrayadapter