Reputation: 2621
i wanted to know how i can add icons beside the application name which is called in androids listview. Yes, i searched and tried various methods to my knowledge but remained unsuccessful, any help is appreciated :)
package mobi.omegacentauri.appcontrol;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.text.DecimalFormat;
import mobi.omegacentauri.appcontrol.R;
import mobi.omegacentauri.appcontrol.appcontrolService.IncomingHandler;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.text.Html;
import android.text.InputType;
import android.text.method.NumberKeyListener;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class appcontrol extends Activity implements ServiceConnection {
public static final boolean DEBUG = true;
static final String MARKET = "Market";
public static final DecimalFormat decimal = new DecimalFormat("0.0");
private ToggleButton activeBox;
private boolean active;
private Messenger messenger = null;
private SharedPreferences options;
private NotificationManager notificationManager;
private boolean getOut = false;
public ListView appsList;
static final int NOTIFICATION_ID = 1;
public static Setting[] getSettings(Context context, SharedPreferences pref) {
Setting[] allSettings = new Setting[]{
new FontSize(context, pref),
new OrientationSetting(context, pref),
new TimeoutSetting(context, pref),
new BoostSetting(context, pref),
new MinCPUSetting(context, pref),
new MaxCPUSetting(context, pref)
};
int count = 0;
for (int i=0; i<allSettings.length; i++)
if (allSettings[i].isActive())
count++;
Setting[] settings = new Setting[count];
count = 0;
for (int i=0; i<allSettings.length; i++) {
if (allSettings[i].isActive())
settings[count++] = allSettings[i];
}
log(""+count+" settings active");
return settings;
}
public static void log(String s) {
if (DEBUG)
Log.v("appcontrol", s);
}
private void message(String title, String msg) {
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle(title);
alertDialog.setMessage(Html.fromHtml(msg));
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,
getResources().getText(R.string.ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {} });
alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {} });
alertDialog.show();
}
private void firstTime() {
if (! options.getBoolean(Options.PREF_FIRST_TIME, true))
return;
SharedPreferences.Editor ed = options.edit();
ed.putBoolean(Options.PREF_FIRST_TIME, false);
ed.commit();
String msg;
msg = "With appcontrol, you can have some different settings in different applications";
message("Welcome", msg);
}
public void helpButton(View v) {
help();
}
private void saveOS() {
}
private void restoreOS() {
}
void stopService() {
log("stop service");
stopService(new Intent(this, appcontrolService.class));
restoreOS();
}
void saveSettings() {
}
void bind() {
log("bind");
Intent i = new Intent(this, appcontrolService.class);
bindService(i, this, 0);
}
void restartService(boolean bind) {
stopService();
saveSettings();
Intent i = new Intent(this, appcontrolService.class);
log("restartService:starting service");
startService(i);
if (bind) {
bind();
}
}
void setActive(boolean value, boolean bind) {
SharedPreferences.Editor ed = options.edit();
ed.putBoolean(Options.PREF_ACTIVE, value);
ed.commit();
if (value) {
log("setActive:restartService");
restartService(bind);
}
else {
stopService();
}
active = value;
updateNotification();
}
public void PleaseBuy(String title, String text, final boolean exit) {
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle(title);
alertDialog.setMessage(Html.fromHtml(text));
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,
"Go to "+MARKET,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
market();
if (exit) {
stopService();
finish();
}
} });
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
"Not now",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (exit) {
stopService();
finish();
}
} });
alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (exit)
finish();
}
});
alertDialog.show();
}
private void market() {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (MARKET.contains("Appstore")) {
// string split up to fool switcher.sh
i.setData(Uri.parse("http://www.amazon.com/gp/mas/dl/android?p=mobi.omegacentauri.Screen" +"Dim."+"Full"));
}
else if (MARKET.contains("AndroidPIT")) {
// string split up to fool switcher.sh
i.setData(Uri.parse("http://www.androidpit.com/en/android/market/apps/app/mobi.omegacentauri.Screen" +"Dim."+"Full"));
}
else {
// string split up to fool switcher.sh
i.setData(Uri.parse("market://details?id=mobi.omegacentauri.Screen" +"Dim."+"Full"));
}
startActivity(i);
}
private void changeLog() {
message("Changes", getAssetFile("changelog.html"));
}
private void help() {
message("Questions and Answers", getAssetFile(isKindle()?"kindlehelp.html":"help.html"));
}
private void versionUpdate() {
int versionCode;
try {
versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
versionCode = 0;
}
if (options.getInt(Options.PREF_LAST_VERSION, 0) != versionCode) {
options.edit().putInt(Options.PREF_LAST_VERSION, versionCode).commit();
changeLog();
}
}
private void chooseSetting(final String app) {
final Setting[] settings = getSettings(this, options);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final AlertDialog dialog;
// builder.setTitle("Choose setting");
View v = View.inflate(this, R.layout.choose_setting, null);
ListView list = (ListView)v.findViewById(R.id.settings);
list.setAdapter(new ArrayAdapter<Setting>(this,android.R.layout.simple_list_item_2,
settings) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = View.inflate(appcontrol.this, android.R.layout.simple_list_item_2, null);
}
else {
v = convertView;
}
((TextView)v.findViewById(android.R.id.text1))
.setText(settings[position].getName());
((TextView)v.findViewById(android.R.id.text2))
.setText(settings[position].describe(app));
return v;
}
});
builder.setView(v);
dialog = builder.create();
dialog.show();
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
log("chose "+settings[position].name);
settings[position].dialog(appcontrol.this, app);
dialog.dismiss();
}
});
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
log("onCreate");
options = PreferenceManager.getDefaultSharedPreferences(this);
versionUpdate();
firstTime();
setContentView(R.layout.main);
notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
active = options.getBoolean(Options.PREF_ACTIVE, false);
// if (active) {
// restartService(true);
// }
// else {
// stopService();
// }
activeBox = (ToggleButton)findViewById(R.id.active);
activeBox.setChecked(active);
activeBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton button, boolean value) {
if (value && !active) {
saveOS();
}
setActive(value, true);
if (value) {
message("Important information",
"If you wish to uninstall or upgrade appcontrol, uncheck the 'Active' "+
"button before uninstalling or upgrading, or some system resources "+
"will be wasted (they can be reclaimed by rebooting your device).");
}
}});
appsList = (ListView)findViewById(R.id.apps);
appsList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
MyApplicationInfo info = (MyApplicationInfo) appsList.getAdapter().getItem(position);
chooseSetting(info.packageName);
}
});
}
public void setNotification(Context c, NotificationManager nm, boolean active) {
int icon = active?R.drawable.brightnesson:R.drawable.brightnessoff;
if (Options.getNotify(options) == Options.NOTIFY_NEVER)
icon = 0;
Notification n = new Notification(
icon,
"appcontrol",
System.currentTimeMillis());
Intent i = new Intent(c, appcontrol.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
n.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
n.setLatestEventInfo(c, "appcontrol", "appcontrol is "+(active?"on":"off"),
PendingIntent.getActivity(c, 0, i, 0));
nm.notify(NOTIFICATION_ID, n);
log("notify "+n.toString());
}
private void updateNotification() {
updateNotification(this, options, notificationManager, active);
}
public void updateNotification(Context c,
SharedPreferences options, NotificationManager nm, boolean active) {
log("notify "+Options.getNotify(options));
switch(Options.getNotify(options)) {
case Options.NOTIFY_AUTO:
if (active)
setNotification(c, nm, active);
else {
log("trying to cancel notification");
nm.cancelAll();
}
break;
case Options.NOTIFY_NEVER:
case Options.NOTIFY_ALWAYS:
setNotification(c, nm, active);
break;
}
}
@Override
public void onResume() {
super.onResume();
updateNotification();
if (getOut) {
log("getting out");
return;
}
(new GetApps(this, appsList, getSettings(this, options))).execute();
if (active) {
restartService(true);
}
else {
stopService();
}
}
@Override
public void onPause() {
super.onPause();
if (getOut)
return;
saveSettings();
if (messenger != null) {
log("unbind");
unbindService(this);
}
}
@Override
public void onStop() {
super.onStop();
log("onStop");
}
@Override
public void onDestroy() {
super.onDestroy();
log("onDestroy");
}
private boolean largeScreen() {
int layout = getResources().getConfiguration().screenLayout;
return (layout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_LARGE;
}
private boolean isKindle() {
return Build.MODEL.equalsIgnoreCase("Kindle Fire");
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (KeyEvent.KEYCODE_MENU == keyCode) {
onWhatToControl(null);
return true;
}
return super.onKeyUp(keyCode, event);
}
public void onWhatToControl(View v) {
startActivity(new Intent(this, Options.class));
}
public void onOptions(View v) {
startActivity(new Intent(this, Options2.class));
}
public void onOtherApps(View v) {
MarketDetector.launch(this);
}
public void sendMessage(int n, int arg1, int arg2) {
if (messenger == null)
return;
try {
log("message "+n+" "+arg1+" "+arg2);
messenger.send(Message.obtain(null, n, arg1, arg2));
} catch (RemoteException e) {
}
}
@Override
public void onServiceConnected(ComponentName classname, IBinder service) {
log("connected");
messenger = new Messenger(service);
try {
messenger.send(Message.obtain(null, IncomingHandler.MSG_RELOAD_SETTINGS, 0, 0));
} catch (RemoteException e) {
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
log("disconnected");
// stopService(new Intent(this, appcontrolService.class));
messenger = null;
}
static private String getStreamFile(InputStream stream) {
BufferedReader reader;
try {
reader = new BufferedReader(new InputStreamReader(stream));
String text = "";
String line;
while (null != (line=reader.readLine()))
text = text + line;
return text;
} catch (IOException e) {
// TODO Auto-generated catch block
return "";
}
}
public String getAssetFile(String assetName) {
try {
return getStreamFile(getAssets().open(assetName));
} catch (IOException e) {
// TODO Auto-generated catch block
return "";
}
}
}
Snap shot
Upvotes: 0
Views: 841
Reputation: 1006724
The icon did not show up because your ListView
row does not contain an ImageView
or anything else that would represent an icon.
So, design your own row layout that contains an ImageView
or something. Use that row layout to replace android.R.layout.simple_list_item_2
when creating your ArrayAdapter
. Then, in getView()
, populate that ImageView
.
Here is a sample project demonstrating putting an icon in ListView
rows. The row contains an ImageView
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="2dip"
android:src="@drawable/ok"
android:contentDescription="@string/icon"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textStyle="bold"/>
<TextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"/>
</LinearLayout>
</LinearLayout>
and the ArrayAdapter
uses that row:
class IconicAdapter extends ArrayAdapter<String> {
IconicAdapter() {
super(DynamicDemo.this, R.layout.row, R.id.label, items);
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
View row=super.getView(position, convertView, parent);
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if (items[position].length()>4) {
icon.setImageResource(R.drawable.delete);
}
else {
icon.setImageResource(R.drawable.ok);
}
TextView size=(TextView)row.findViewById(R.id.size);
size.setText(String.format(getString(R.string.size_template), items[position].length()));
return(row);
}
}
Upvotes: 1