I’ve a question with regard to android adapters.
I have a class, extending BaseAdapter. Which basically is my adapter. I am opening a database connection in this adapter and writing to a database when the user clicks on a button.
Is this a bad practice to open database connection in an adapter class? if so how do I overcome this?
I am not using the database to query, I’m only using it to insert a value when the user clicks on a button.
Here’s a code snippet. I’ve cut out most of the code for brevity
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String genre = "";
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.featured_tab_sublayout, null);
}
ImageView imgFavourite = (ImageView) convertView.findViewById(R.id.imgFavourite);
imgFavourite.setOnClickListener(favPicture);
imgFavourite.setTag(position);
return convertView;
}
OnClickListener favPicture = new OnClickListener() {
@Override
public void onClick(View v) {
int i = (Integer) v.getTag();
Radio rad = radios.get(i);
if(db.Exists(rad.getmStreamLink())){
showConfirmation(i,rad);
}else{
String genre = "";
if(rad.getGenre().size()>0){
for(String g: rad.getGenre()) {
genre += g + ",";
}
}
db.insertOrder(rad.getmName(), rad.getmDesc(), rad.getmLogo(),
genre, rad.getmCountry(), rad.getmCity(), rad
.getmStreamLink(), rad.getmTwitter(), rad
.getmFacebook(), rad.getmWebsite(), rad
.getmRadionomyID(), rad.getmAudienceRank());
ErrorDialog.show(context, resource.getString(R.string.alert_dialog_fav_added));
/*String name, String desc, String logo,
String genre, String country, String city, String stream_link,
String twitter, String facebook, String website, String radionomy,
String audience_rank*/
}
}
};
Probably you have good reason to use
imgFavourite.setOnClickListener(favPicture);but this is not the usual way to listen for clicks in adapter.Usual way is in your activity to call
lv.setOnItemClickListener(new OnItemClickListener() {...});wherelvis your list view. Replace “…” with body of the onItemClick() which will contain essentially the same as youronClick(View v). You will get position as a parameter so you will not need to usesetTag()/getTag().That you you move your DB functionality out of the adapter which is the correct way to do it in most cases.