0

ユーザーがホーム画面で変更するアイコンを選択できるアイコンピッカーがあります。

グリッドビューを分割して、アプリ、ゲームフォルダーなどのカテゴリに分類できるようにしたかったのです。

ビューを正しく取得して正しく表示することはできますが、onclick リスナーが機能しません。アイコンをクリックしても、アイコンは元に戻りません。

また、私はこれをやり過ぎているようですか?グリッドビュー用に 2 つのアダプターを設定する必要がありますか? 私のlogcatでは、大量のdalvikvm GC_FOR_ALLOCが解放されます.......このクラスが起動されたときに発生する行。

これは私のicons2クラスです

package bigdx.clean.multi;

import java.util.ArrayList;

import bigdx.clean.multi.R;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class Icons2 extends Activity implements AdapterView.OnItemClickListener {

    public Uri CONTENT_URI;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int iconSize=getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
        setContentView(R.layout.icon_picker);

        ExpandableHeightGridView g=(ExpandableHeightGridView) findViewById(R.id.icon_grid_folders);
        g.setExpanded(true);
        g.setOnItemClickListener(this);
        g.setAdapter(new IconsAdapter(this, iconSize));
        g.setOnItemClickListener(this);

        ExpandableHeightGridView g2=(ExpandableHeightGridView) findViewById(R.id.icon_grid_apps);
        g2.setExpanded(true);
        g2.setOnItemClickListener(this);
        g2.setAdapter(new IconsAdapter2(this, iconSize));
        g2.setOnItemClickListener(this);

        this.CONTENT_URI = Uri.parse("content://" + IconsProvider.class.getCanonicalName());

    }
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

                String str = adapterView.getItemAtPosition(position).toString();
                setResult(-1, new Intent(null, Uri.withAppendedPath(this.CONTENT_URI, str)));
                finish();
              }

    class IconsAdapter extends BaseAdapter{
        private Context mContext;
        private int mIconSize;
        private ArrayList<Integer> mThumbs;

        public IconsAdapter(Context mContext, int iconsize) {
            this.mContext = mContext;
            this.mIconSize = iconsize;
                  loadIcons();
                }

        @Override
        public int getCount() {
            return mThumbs.size();
        }

        @Override
        public Object getItem(int position) {
            return mThumbs.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
            } else {
                imageView = (ImageView) convertView;
            }
            imageView.setImageResource(mThumbs.get(position));
            return imageView;
        }

        private void loadIcons() {
            mThumbs = new ArrayList<Integer>();

            final Resources resources = getResources();
            final String packageName = getApplication().getPackageName();

            addIcons(resources, packageName, R.array.icon_pack_folders);
        }
        private void addIcons(Resources resources, String packageName, int list) {
            final String[] extras = resources.getStringArray(list);
            for (String extra : extras) {
                int res = resources.getIdentifier(extra, "drawable", packageName);
                if (res != 0) {
                    final int thumbRes = resources.getIdentifier(extra,"drawable", packageName);
                    if (thumbRes != 0) {
                        mThumbs.add(thumbRes);
                    }
                }
            }
        }

    }
    class IconsAdapter2 extends BaseAdapter{
        private Context mContext;
        private int mIconSize;
        private ArrayList<Integer> mThumbs;

        public IconsAdapter2(Context mContext, int iconsize) {
            this.mContext = mContext;
            this.mIconSize = iconsize;
                  loadIcons();
                }

        @Override
        public int getCount() {
            return mThumbs.size();
        }

        @Override
        public Object getItem(int position) {
            return mThumbs.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
            } else {
                imageView = (ImageView) convertView;
            }
            imageView.setImageResource(mThumbs.get(position));
            return imageView;
        }

        private void loadIcons() {
            mThumbs = new ArrayList<Integer>();

            final Resources resources = getResources();
            final String packageName = getApplication().getPackageName();

            addIcons(resources, packageName, R.array.icon_pack_apps);
        }
        private void addIcons(Resources resources, String packageName, int list) {
            final String[] extras = resources.getStringArray(list);
            for (String extra : extras) {
                int res = resources.getIdentifier(extra, "drawable", packageName);
                if (res != 0) {
                    final int thumbRes = resources.getIdentifier(extra,"drawable", packageName);
                    if (thumbRes != 0) {
                        mThumbs.add(thumbRes);
                    }
                }
            }
        }

    }
}

これは私のアイコンピッカーのレイアウトです

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="fill_parent" >
    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/back_dark" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:paddingTop="75dp" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_weight="0"
                android:background="@drawable/text_divider"
                android:paddingLeft="10dp"
                android:text="@string/icon_folders"
                android:textColor="@color/divider"
                android:textSize="24sp" />

            <bigdx.clean.multi.ExpandableHeightGridView
                android:id="@+id/icon_grid_folders"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView1"
                android:gravity="center"
                android:horizontalSpacing="2dp"
                android:isScrollContainer="false"
                android:listSelector="@drawable/grid_selector"
                android:numColumns="4"
                android:stretchMode="columnWidth"
                android:verticalSpacing="20dp" />

            <TextView
                android:id="@+id/TextView01"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/icon_grid_folders"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_weight="0"
                android:background="@drawable/text_divider"
                android:paddingLeft="10dp"
                android:text="@string/icon_apps"
                android:textColor="@color/divider"
                android:textSize="24sp" />

            <bigdx.clean.multi.ExpandableHeightGridView
                android:id="@+id/icon_grid_apps"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/TextView01"
                android:gravity="center"
                android:horizontalSpacing="2dp"
                android:isScrollContainer="false"
                android:listSelector="@drawable/grid_selector"
                android:numColumns="4"
                android:stretchMode="columnWidth"
                android:verticalSpacing="20dp" />
        </RelativeLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@color/semiblack"
            android:scaleType="center"
            android:src="@drawable/theme_header2" />

    </LinearLayout>

</RelativeLayout>

更新されたicons2クラス

package bigdx.clean.multi;

import java.util.ArrayList;

import bigdx.clean.multi.R;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class Icons extends Activity {
    private static final String ACTION_ADW_PICK_ICON="org.adw.launcher.icons.ACTION_PICK_ICON";
    private static final String ACTION_ADW_PICK_RESOURCE="org.adw.launcher.icons.ACTION_PICK_ICON_RESOURCE";
    private boolean mPickerMode=false;
    private boolean mResourceMode=false;
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int iconSize=getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
        setContentView(R.layout.icon_picker);

        if(getIntent().getAction().equals(ACTION_ADW_PICK_ICON)){
            mPickerMode=true;
        }
        if(getIntent().hasExtra(ACTION_ADW_PICK_RESOURCE)){
            mResourceMode=true;
        }

        ExpandableHeightGridView g=(ExpandableHeightGridView) findViewById(R.id.icon_grid_folders);
        ExpandableHeightGridView g2=(ExpandableHeightGridView) findViewById(R.id.icon_grid_apps);
        g.setExpanded(true);
        g2.setExpanded(true);
        g.setAdapter(new IconsAdapter(this, iconSize, g.getId()));
        g2.setAdapter(new IconsAdapter(this, iconSize, g2.getId()));

        g.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                if(mPickerMode){
                    Intent intent=new Intent();
                    if(!mResourceMode){
                        Bitmap bitmap=null;
                        try{
                            bitmap=(Bitmap) adapterView.getAdapter().getItem(position);
                        }catch (Exception e) {
                        }
                        if(bitmap!=null){
                            intent.putExtra("icon",bitmap);
                            setResult(RESULT_OK, intent);
                        }else{
                            setResult(RESULT_CANCELED, intent);
                        }
                    }else{
                        ShortcutIconResource res=((IconsAdapter)adapterView.getAdapter()).getResource(position);
                        if(res!=null){
                            intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, res);
                            setResult(RESULT_OK, intent);
                        }else{
                            setResult(RESULT_CANCELED, intent);
                        }
                    }
                    finish();
                }
            }
        });

        g2.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                if(mPickerMode){
                    Intent intent=new Intent();
                    if(!mResourceMode){
                        Bitmap bitmap=null;
                        try{
                            bitmap=(Bitmap) adapterView.getAdapter().getItem(position);
                        }catch (Exception e) {
                        }
                        if(bitmap!=null){
                            intent.putExtra("icon",bitmap);
                            setResult(RESULT_OK, intent);
                        }else{
                            setResult(RESULT_CANCELED, intent);
                        }
                    }else{
                        ShortcutIconResource res=((IconsAdapter)adapterView.getAdapter()).getResource(position);
                        if(res!=null){
                            intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, res);
                            setResult(RESULT_OK, intent);
                        }else{
                            setResult(RESULT_CANCELED, intent);
                        }
                    }
                    finish();
                }
            }
        });

    }
    private class IconsAdapter extends BaseAdapter{
        private Context mContext;
        private int mIconSize;
        private int mG;

        public IconsAdapter(Context mContext, int iconsize, int g) {
            super();
            this.mContext = mContext;
            this.mIconSize = iconsize;
            this.mG = g;
            loadIcons();
        }

        @Override
        public int getCount() {
            return mThumbs.size();
        }

        public ShortcutIconResource getResource(int position){
            return ShortcutIconResource.fromContext(Icons.this,
                    mThumbs.get(position));
        }
        @Override
        public Object getItem(int position) {
            Options opts=new BitmapFactory.Options();
            opts.inPreferredConfig=Bitmap.Config.ARGB_8888;
            return BitmapFactory.decodeResource(mContext.getResources(), mThumbs.get(position), opts);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
            } else {
                imageView = (ImageView) convertView;
            }
            imageView.setImageResource(mThumbs.get(position));
            return imageView;
        }

        private ArrayList<Integer> mThumbs;
        ////////////////////////////////////////////////
        private void loadIcons() {
            mThumbs = new ArrayList<Integer>();

            final Resources resources = getResources();
            final String packageName = getApplication().getPackageName();

            switch (mG){
            case R.id.icon_grid_folders:
                addIcons(resources, packageName, R.array.icon_pack_folders);
            case R.id.icon_grid_apps:
                addIcons(resources, packageName, R.array.icon_pack_apps);
            }


        }
        private void addIcons(Resources resources, String packageName, int list) {
            final String[] extras = resources.getStringArray(list);
            for (String extra : extras) {
                int res = resources.getIdentifier(extra, "drawable", packageName);
                if (res != 0) {
                    final int thumbRes = resources.getIdentifier(extra,"drawable", packageName);
                    if (thumbRes != 0) {
                        mThumbs.add(thumbRes);
                    }
                }
            }
        }

    }

}

アイコンはクリック可能ですが、各グリッドビューを 1 つのアダプターで設定する必要があります

4

1 に答える 1

0

IDE に関数自体を作成させます。@Override アノテーションがないので、自分で書いたように見えます。

あなたの onItemClick 関数を削除してみてください。あなたは注釈でそれを見るべきです:

@Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

    }

それでもうまくいかない場合 (理由がわからない)、匿名で試してください:

g.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            // your logic here...
        }
    });

2 番目の質問については、画像リソースをロードして設定するときに、システムが大量のメモリを使用しているようです。ビットマップをデコードし、画面に合わせてサイズを変更することをお勧めします。

幸運を

于 2013-06-12T18:25:15.293 に答える