Android 自定义适配器中的getView(),其对象在自定义视图中创建,而不是调用?
我有一个活动。它调用自定义视图LevelViewAndroid 自定义适配器中的getView(),其对象在自定义视图中创建,而不是调用?,android,view,baseadapter,Android,View,Baseadapter,我有一个活动。它调用自定义视图LevelView public class LevelActivity extends Activity{ ArrayList<Tile> mTiles = new ArrayList<Tile>(); public static Resources resources; @Override public void onCreate(Bundle savedInsta
public class LevelActivity extends Activity{
ArrayList<Tile> mTiles = new ArrayList<Tile>();
public static Resources resources;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
resources = this.getResources();
setContentView(new LevelView(this));
}
}
public类LevelActivity扩展了活动{
ArrayList mTiles=新的ArrayList();
公共静态资源;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
resources=this.getResources();
setContentView(新的LevelView(本));
}
}
自定义的LevelView类--
LevelView用于创建一个gridView,该gridView应该由平铺对象填充。因此,将创建一个自定义适配器TileAdapter对象
public class LevelView extends View{
Context mContext;
Canvas mCanvas;
ArrayList<Tile>mTiles = new ArrayList<Tile>();
boolean drawGlow;
View mSingleTileView;
int mSingleTilePosition;
TileAdapter mAdapter;
public LevelView(Context context) {
super(context);
mContext = context;
LayoutInflater GridLayout = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
GridView gridview = (GridView) GridLayout.inflate(R.layout.level_view, null);
this.addTilesToLevel();
mAdapter = new TileAdapter(mContext, mTiles);
gridview.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
mSingleTileView = v;
mSingleTilePosition = position;
drawGlow = true;
Toast.makeText(mContext, "" + position, Toast.LENGTH_SHORT).show();
LevelView.this.invalidate();
}
});
}
void addTilesToLevel() {
RedTile redTile = new RedTile();
redTile.addColor();
redTile.addTileImage();
mTiles.add(redTile);
mTiles.add(redTile);
mTiles.add(redTile);
mTiles.add(redTile);
}
}
public类LevelView扩展了视图{
语境;
帆布mCanvas;
ArrayListTiles=新的ArrayList();
布尔拉丝发光;
查看mSingleTileView;
int-msingleteposition;
瓦莱达普特马达普特;
公共级别视图(上下文){
超级(上下文);
mContext=上下文;
LayoutInflater GridLayout=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
GridView GridView=(GridView)GridLayout.inflate(R.layout.level\u视图,null);
此.addTilesToLevel();
mAdapter=新的tiledapter(mContext,mTiles);
setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
mSingleTileView=v;
mSingleTilePosition=位置;
drawGlow=true;
Toast.makeText(mContext,“+位置,Toast.LENGTH_SHORT.show();
LevelView.this.invalidate();
}
});
}
void addTilesToLevel(){
RedTile RedTile=新的RedTile();
redTile.addColor();
redTile.addTileImage();
mTiles.add(红瓦);
mTiles.add(红瓦);
mTiles.add(红瓦);
mTiles.add(红瓦);
}
}
TileAdapter类---
TileAdapter包含getView()方法。问题就在这里。未调用此方法
public class TileAdapter extends BaseAdapter{
String TAG = "TileAdapter";
private Context mContext;
ArrayList<Tile> mTiles;
public TileAdapter(Context c,ArrayList<Tile> tiles) {
super();
mContext = c;
mTiles = tiles;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mTiles.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView;
int tileCount = getCount();
Log.i(TAG, "In getView");
GridView gridView = (GridView)parent;
gridView.setNumColumns((int)(tileCount/2));
if(convertView == null) {
imageView = new ImageView(mContext);
int viewWidth = imageView.getWidth();
int viewHeight = imageView.getHeight();
imageView.setLayoutParams(new GridView.LayoutParams(100, 200));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(4, 4, 4, 4);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageBitmap(mTiles.get(position).getTileImage());
return imageView;
}
}
公共类TileAdapter扩展BaseAdapter{
String TAG=“TileAdapter”;
私有上下文;
阵列列表;
公共TileAdapter(上下文c、ArrayList tiles){
超级();
mContext=c;
mTiles=瓷砖;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回mTiles.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
图像视图图像视图;
int tileCount=getCount();
Log.i(标记“在getView中”);
GridView GridView=(GridView)父级;
setNumColumns((int)(tileCount/2));
if(convertView==null){
imageView=新的imageView(mContext);
int viewWidth=imageView.getWidth();
int viewHeight=imageView.getHeight();
setLayoutParams(新的GridView.LayoutParams(100200));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
设置填充(4,4,4,4);
}否则{
imageView=(imageView)convertView;
}
setImageBitmap(mTiles.get(position.getTileImage());
返回图像视图;
}
}
如果我能找到解决这个问题的办法,那将大有帮助。谢谢。尝试调试write System.out.println(“Levelview正在调用,,,”;在超级(上下文)之后的Levelview构造函数中;我很确定您应该在
getItem(int位置)
中返回一个实际对象;e、 g.将其更改为返回mTiles.get(position)
。别忘了确认列表中确实包含元素。您可能还想看看替代ArrayAdapter的实现,默认情况下它已经为您完成了一些这方面的工作。@Ankit正在调用LevelView构造函数。@MH。ArrayAdapter与TextView引用id一起工作,我不使用TextView。您可以使ArrayAdapter与您喜欢的任何布局/内容一起工作,只需一个,并查看其中一个。