1

次のアダプターがあります。

private class RepeatingAdapter extends ArrayAdapter<Repeatable> {

    private List<Repeatable> items;
    private LayoutInflater inflater;
    private int resource;

        public RepeatingAdapter(Context context, int resource,
                List<Repeatable> items) {
            super(context, resource, items);
            this.items=items;
            this.resource=resource;
            inflater=LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View view, ViewGroup group) {
            View item=(view==null) ? inflater.inflate(resource, null) : view;
            TextView title=(TextView)item.findViewById(R.id.listItemRepeatingTypeTitle);
            title.setText(items.get(position).getTitle());
            items.get(position).setCommand(new RedRectangleCommand(item));
            Log.e("view", item.toString());
            return item;
        }

        @Override
        public Repeatable getItem(int position) {
            return items.get(position);
        }
}

新しい RedRectangleCommand を作成し、View created をそれに送信することに注意してください。そのため、次のことも行います。

    repeatingList.setAdapter(new RepeatingAdapter(this, 
        R.layout.list_item_repeating_type, types));
    repeatingList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            ((Repeatable)parent.getItemAtPosition(position)).mark();
        }

    });

選択したアイテムに対して mark() メソッドを実行することに注意してください (Repeatable の Mark メソッドは、コマンドに対して mark() メソッドを実行します)。すべてが良いです。コマンドの最後のコード:

private class RedRectangleCommand extends Command {

    private View view;
    public RedRectangleCommand(View view) {
        this.view=view;
    }

        @Override
        public void mark() {
            ImageView image=(ImageView)view.findViewById(R.id.listItemRepeatingTypeImage);
            image.setBackgroundColor(Color.RED);
            image.invalidate();
        }

        @Override
        public void unmark() {
            ImageView image=(ImageView)view.findViewById(R.id.listItemRepeatingTypeImage);
            image.setBackgroundColor(Color.BLACK);
        }       
}

クリックして選択したビューから ImageView の色を変更する必要があります。しかし、うまくいきません!また、私のログは、選択されたアイテムとコマンドからのアイテムが異なるものであることを示しています。どうしたの?

4

1 に答える 1

0

代わりにこれを試してみて、何か違うかどうかを確認してください。カスタム アダプタのメソッドにすることで、RedRectangleCommand オブジェクトを直接参照しようとします。

    RepeatingAdapter rAdapter = new RepeatingAdapter(this, 
            R.layout.list_item_repeating_type, types);

    repeatingList.setAdapter(rAdapter);
    repeatingList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            rAdapter.markCommand(position);
        }

    });

次に、アダプターで:

private class RepeatingAdapter extends ArrayAdapter {

        private List<Repeatable> items;
        private LayoutInflater inflater;
        private int resource;

        public RepeatingAdapter(Context context, int resource,
                List<Repeatable> items) {
            super(context, resource, items);
            this.items=items;

            // .... some code

        public void markCommand(int position) {
            items.get(position).mark();
        }
    }

また、本当の問題は getView のその部分だと思います:

items.get(position).setCommand(new RedRectangleCommand(item));

現在のところ、これらのオブジェクトの新しいオブジェクトを作成し、使用されているかどうかに関係なく、listView 行がビューから消えて再び戻ってきている限り、何度も何度もインスタンス化を繰り返しています。特に特定のインスタンスを参照しようとすると、どれだけ無駄で面倒なことになるか想像できます。これにはいくつかの方法があるはずです。たとえば、その Repeater がまだ setCommand を持っていない場合にのみ setCommand を実行できます。おそらく、ブール値メソッドを作成して、それらの RedRectangleCommand のいずれか、または convertView が null かどうかをチェックするようなものがあるかどうかを確認します。私がしっかりとしようとしている別のアイデアは、コンストラクターの作業を行うことですが、パラメーターが必要なのがView面倒なようです:

private View item;
public RepeatingAdapter(Context context, int resource,
            List<Repeatable> items) {
        super(context, resource, items);
        this.items=items;
        this.resource=resource;

        inflater=LayoutInflater.from(context);
        item = inflater.inflate(resource, null);

        for (int i = 0; i < items.size; i++) {
            items.get(i).setCommand(new RedRectangleCommand(item));
        }
于 2012-11-16T23:58:05.517 に答える