0

Java Android サンプル サイトからコピーしたコードをテストしています。ユーザーが現在のアクティビティの行をクリックしたときに新しいアクティビティを開始するように変更しようとしています。したがって、Intent メソッドを使用していますが、現在の View インスタンス引数を Intent メソッドに参照する方法がわかりません。

数十の組み合わせを試し、2 日間かけて調査しました。これは、私が知っている多くの人にとっては基本的なことのように思えるかもしれませんが、申し訳ありませんが、Java、Eclipse、および Android SDK (ターゲット = API 8) を学習する私にとっては第 2 週です。

    public class CustomListViewDemo extends ListActivity {
private EfficientAdapter adap;
private static String[] data = new String[] { "0", "1" };
private static String[] TitleString = new String[] { "Title1", "Title2" };
private static String[] DetailString = new String[] { "Detail1", "Detail2" };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    adap = new EfficientAdapter(this);
    setListAdapter(adap);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, "Click-" + String.valueOf(position),
            Toast.LENGTH_SHORT).show();
}

public static class EfficientAdapter extends BaseAdapter implements
        Filterable {
    private LayoutInflater mInflater;
    private Bitmap mIcon1;
    private Context context;

    public EfficientAdapter(Context context) {
        // Cache the LayoutInflate to avoid asking for a new one each time.
        mInflater = LayoutInflater.from(context);
        this.context = context;
    }

    /**
     * Make a view to hold each row.
     * 
     */
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.adaptor_content, null);

            holder = new ViewHolder();
            holder.textLine = (TextView) convertView
                    .findViewById(R.id.textLine);
            holder.buttonLine = (Button) convertView
                    .findViewById(R.id.buttonLine);
            holder.DbuttonLine = (Button) convertView
                    .findViewById(R.id.DbuttonLine);
            holder.textLine2 = (TextView) convertView
                    .findViewById(R.id.textLine2);

            convertView.setOnClickListener(new OnClickListener() {
                private int pos = position;

                @Override
                public void onClick(View v) {
                    // Toast.makeText(context, "Click-" +
                    // String.valueOf(pos),
                    // Toast.LENGTH_SHORT).show();

        // ******************** ERROR IS LINE BELOW *********
                    // "No enclosing instance of the type CustomListViewDemo is accessible in scope"
                    Intent i = new Intent(CustomListViewDemo.this, IntentA.class);
                    startActivity(i);

                }
            });


            holder.buttonLine.setOnClickListener(new OnClickListener() {
                private int pos = position;

                @Override
                public void onClick(View v) {
                    Toast.makeText(context,
                            "Delete-" + String.valueOf(pos),
                            Toast.LENGTH_SHORT).show();

                }
            });

            holder.DbuttonLine.setOnClickListener(new OnClickListener() {
                private int pos = position;

                @Override
                public void onClick(View v) {
                    Toast.makeText(context,
                            "Details-" + String.valueOf(pos),
                            Toast.LENGTH_SHORT).show();

                }
            });

            convertView.setTag(holder);
        } else {
            // Get the ViewHolder back to get fast access to the TextView
            // and the ImageView.
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textLine.setText(TitleString[position]
                + String.valueOf(position));
        holder.textLine2.setText(DetailString[position]
                + String.valueOf(position));

        return convertView;
    }

    static class ViewHolder {
        TextView textLine;
        TextView textLine2;
        Button buttonLine;
        Button DbuttonLine;

    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return data[position];
    }

}

}

ネストされたクラスの外部メンバーを参照する方法について多くの例を見てきましたが、メソッドの引数として使用する外部クラスのビュー インスタンスを見つける良い例は見つかりませんでした。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

0
CustomListViewDemo.this

が機能するにはthis、インスタンスが必要です。

入れ子になった静的クラスには、外部インスタンスはありません。

クラスを「非静的」にするか、ここで使用する CustomListViewDemo インスタンスへの参照を明示的に渡す必要があります。

于 2012-06-05T03:49:48.860 に答える
0

ドキュメントを見ると、呼び出しているコンストラクター ( new Intent(CustomListViewDemo.this, IntentA.class)) は次のとおりです。

public Intent (Context packageContext, Class<?> cls)

すでにコンテキストを保存しているため、new Intent(this.context, IntentA.class)代わりに使用して問題を解決できます。

于 2012-06-05T03:49:50.607 に答える
0

EfficientAdapterは静的クラスであるため、CustomListViewDemoまだ使用できる のインスタンスがあるとは限りません。staticは、インスタンスなしでクラスを使用できることを意味するため、エラーが発生します

"No enclosing instance of the type CustomListViewDemo is accessible in scope" 

ここには 2 つのオプションがあります。

1) dmon の提案に従い、保存したコンテキストを使用します。

Intent i = new Intent(context, IntentA.class);

2) 静的クラスを作成しないEfficientAdapter(静的にする理由は何ですか?)

于 2012-06-05T03:56:38.630 に答える