今回もよろしくお願いします。
現在、端末内にインストールされているアプリケーションのアイコンと名前を
一覧にしてGridViewに表示する処理をさせようと思っています。
そこで以下のようなコードを書きました。
MainActivity.java
public class MainActivity extends Activity {
private List<AppData> appList = new ArrayList<AppData>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_grid);
CustomGridAdapter customAdapter = new CustomGridAdapter(this,0,appList);
final GridView mGridView = (GridView) findViewById(R.id.app_grid);
mGridView.setAdapter(customAdapter);
PackageManager pManager = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);
final List<ResolveInfo> rInfoList = pManager.queryIntentActivities(intent,0);
for(ResolveInfo rInfo : rInfoList){
AppData appInfo = new AppData();
if(rInfo != null){
appInfo.appName = rInfo.loadLabel(pManager).toString();
try{
Drawable icon = pManager.getApplicationIcon(appInfo.appPackage);
appInfo.appIcon = icon;
appList.add(appInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Collections.sort(appList, appComparator);
}
private static final Comparator<AppData> appComparator = new Comparator<AppData>(){
private final Collator collator = Collator.getInstance();
@Override
public int compare(AppData map1, AppData map2) {
return collator.compare(map1.appName, map2.appName);
}
};
}
public class CustomGridAdapter extends ArrayAdapter<AppData>{
private LayoutInflater lInflater;
public CustomGridAdapter(Context context,int ResourceId,List<AppData> objects) {
super(context, ResourceId, objects);
lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
AppData item = getItem(position);
ViewHolder holder;
if(convertView == null){
convertView = lInflater.inflate(R.layout.grid_layout, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.grid_app_name);
holder.image = (ImageView) convertView.findViewById(R.id.grid_app_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(item.appName);
holder.image.setImageDrawable(item.appIcon);
return convertView;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<GridView
android:id="@+id/app_grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchMode="columnWidth"
android:numColumns="auto_fit"
android:background="#00000000" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/grid_app_icon"
android:layout_width="60dp"
android:layout_height="60dp"
android:contentDescription="@string/app_name"
android:background="#c8ffffff" />
<TextView
android:id="@+id/grid_app_name"
android:textColor="#ffffff"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:background="#64000000"
android:maxLines="1" />
</LinearLayout>
GridViewは横に2列しか項目が表示されず、だいぶ隙間が空いていました。
しかも、項目が表示されるのはエリアの左側に偏っており真ん中に表示されません。
GridViewの項目をできる限り画面に敷き詰める方法と
項目をエリアの中心に表示させる方法を教えていただきたいと思います。
毎度説明が下手で恐縮ですが、どうかよろしくお願いします。