我创建了一个包含gridview的新布局。运行应用程序时,gridview正在获得预期的内容。
gridview的每个单元格都有一个普通的特定模板。单击一个单元格时,会将一个新模板加载到此单元格中。 With the help of @wanglugao, every thing is working fine so far。
现在我想在点击项目时通过普通模板刷新未被删除的项目。只有被点击的项目才需要包含新模板。但是,当我点击一个项目时,即使我点击了其他项目,它仍然保留在新模板中。
图片链接说明了我的current status
这是我的BaseAdapter,
public class KategoriAdapter extends BaseAdapter{
private Context mContext;
private String[] categoryValues;
private Bitmap[] pictures;
private String mTag = "NORMAL_TEMPLATE";
//indicate that position using new template
private int mNewTemplatePos = -1;
//indicate that this is normal template view
private final String NORMAL_TEMPLATE = "NORMAL_TEMPLATE";
//indicate that this is new template view
private final String NEW_TEMPLATE = "NEW_TEMPLATE";
public KategoriAdapter(Context context, String[] categoryValues, Bitmap[] pictures) {
this.mContext = context;
this.categoryValues = categoryValues;
this.pictures = pictures;
}
//apply new template to positon
public void useNewTemplate(int pos) {
mNewTemplatePos =pos;
//notiy list that data has changed and the list will refresh ui itself.
notifyDataSetChanged();
}
@Override
public int getCount() {
return categoryValues.length;
}
@Override
public Object getItem(int possition) {
return null;
}
@Override
public long getItemId(int possition) {
return 0;
}
@Override
public View getView(int possition, View convertView, ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
if (mNewTemplatePos==possition) {
convertView = getNewTemplate(inflater, possition);
//use tag to indicate the type of the template
convertView.setTag(NEW_TEMPLATE);
} else {
convertView = getNormalTemplate(inflater, possition);
convertView.setTag(NORMAL_TEMPLATE);
mTag = (String) convertView.getTag();
}
} else {
switch (mTag) {
case NORMAL_TEMPLATE:
//convertView is the normal template view but you need a new template view in possition
if (mNewTemplatePos==possition)
convertView = getNewTemplate(inflater, possition);
break;
case NEW_TEMPLATE:
//convertView is the new template view but you need a normal template view in possition
if (mNewTemplatePos!=possition)
convertView = getNormalTemplate(inflater, possition);
break;
default:
break;
}
}
return convertView;
}
private View getNormalTemplate(LayoutInflater inflater, int possition) {
final View grid = inflater.inflate(R.layout.kategoriler_list_item, null);
TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad);
ImageView categoryPictures = (ImageView) grid.findViewById(R.id.grid_item_resim);
cName.setText(categoryValues[possition]);
categoryPictures.setImageBitmap(pictures[possition]);
return grid;
}
private View getNewTemplate(LayoutInflater inflater, int possition) {
final View grid = inflater.inflate(R.layout.kategori_secenek_template, null);
TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad);
cName.setText(categoryValues[possition]);
Button btn_nesne_tani = (Button) grid.findViewById(R.id.btn_nesneleri_taniyalim);
Button btn_cumle_kur = (Button) grid.findViewById(R.id.btn_cumle_kuralim);
btn_nesne_tani.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"nesne",Toast.LENGTH_SHORT).show();
}
});
btn_cumle_kur.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"cümle",Toast.LENGTH_SHORT).show();
}
});
return grid;
}
}
我的Activity.java的相关部分
}
final KategoriAdapter adapter = new KategoriAdapter(getApplicationContext(), mKategoriler, kategoriResimleri);
grid=(GridView)findViewById(R.id.gv_kategoriler);
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.useNewTemplate(position);
Toast.makeText(getApplicationContext(), mKategoriler[position].toString(),Toast.LENGTH_SHORT).show();
}
});
提前致谢。
答案 0 :(得分:0)
问题在于您使用mTag
。您使用此选项并仅使用此选项来确定转换视图不为空时要使用的模板,但仅在向新的转换视图进行充气时设置该模板。
mTag
不应该是实例字段。它应该是您(始终)在getView()
方法中设置的本地。就像这样,
Tag tag = mNewTemplatePos==possition ? NEW : NORMAL;
switch (tag) {
// inflate base on the tag
}
此外,您还没有正确使用转换视图;在某些情况下,你扔掉它。如果网格中有两个非常不同的单元格,则应使用视图类型(Google it)或使用一个布局,并通过隐藏或显示部分来改变它。