Hamza Polat Hamza Polat - 3 months ago 17
Android Question

How to refresh other items when clicked a specific item of gridview in android

I created a new layout containing a gridview. When the application is run, gridview is getting expected content.

Each cell of gridview has a normal specific template. When clicked a cell, a new template is loaded to this cell. With the help of @wanglugao, every thing is working fine so far.

Now i want to refresh the unclicked items by the normal template when i clicked an item. Only the clicked item need to include the new template. But, when i clicked an item, it remained with the new template even if i clicked an other item.

image link illustrates my current status

This is my 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;
}


}

And related part of my 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();
}
});


Thanks in advance.

Answer

The problem is your use of mTag. You use this and only this to determine what template to use when your convert view is not null, but you only set it when you are inflating a new convert view.

mTag should not be an instance field. It should be a local which you (always) set in your getView() method. So like this,

Tag tag = mNewTemplatePos==possition ? NEW : NORMAL;
switch (tag) {
  // inflate base on the tag
}

Also, you aren't using your convert view properly; you throw it away in some cases. If you have two very different cells in your grid, you should either use view types (Google it) or have one layout and vary it by hiding or showing sections.