简体   繁体   中英

Can't figure out correct argument form - calling a method from within a static nested class in Java

I'm testing code copied from a Java Android examples site. I'm trying to modify it to start a new activity when a user clicks into a row of the current activity. So I'm using the Intent method but I'm not able to figure out how to reference the current View instance argument to the Intent method.

I've tried dozens of combinations, and spent 2 days researching. This must seem basic to many of you I know, but my apologies, this is week #2 for me learning Java, Eclipse and the Android SDK (target= API 8)

    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];
    }

}

}

I have seen many examples about how to refer to outer members of nested classes but not found a good example on find the view instance of an outer class for use as a method argument. Can anyone point me in the right direction?

CustomListViewDemo.this

For this to work, you need an instance.

In a static nested class, there is no outer instance.

You have to either make the class "non-static", or explicitly pass a reference to a CustomListViewDemo instance around that you want to use here.

If you look at the docs, the constructor you're invoking ( new Intent(CustomListViewDemo.this, IntentA.class) ), is this one:

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

Since you're already storing a Context, you can fix your problem by using new Intent(this.context, IntentA.class) instead.

EfficientAdapter is a static class so you don't necessarily have an instance of CustomListViewDemo that you can use yet. Static implies that the class can be used without an instance, hence your error

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

You have two options here.

1) Go with dmon's suggestion and use the context you have stored:

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

2) Do not make EfficientAdapter a static class (what is the reason for having it static?)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM