2012-06-05 3 views
0

Java Android 예제 사이트에서 복사 한 코드를 테스트하고 있습니다. 사용자가 현재 활동의 행을 클릭하면 새 활동을 시작하도록 수정하려고합니다. 그래서 Intent 메서드를 사용하고 있지만 현재 View 인스턴스 인수를 Intent 메서드로 참조하는 방법을 파악할 수 없습니다.올바른 인수 형식을 알아낼 수 없습니다 - Java의 정적 중첩 클래스에서 메서드 호출

나는 수십 개의 조합을 시도하고 연구 2 일을 보냈다. 이것은 내가 아는 당신,하지만 내 사과의 많은 기본 것임에 틀림없는 것 같습니다이 나를 자바, 이클립스와 안드로이드 SDK를 학습 (목표 = 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]; 
    } 

} 

} 내가 가진

주 # 2입니다 중첩 된 클래스의 외부 멤버를 참조하는 방법에 대한 많은 예제를 보았지만 메서드 인수로 사용할 외부 클래스의 뷰 인스턴스를 찾는 좋은 예제를 찾지 못했습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0

, 당신이 호출하고 생성자 (new Intent(CustomListViewDemo.this, IntentA.class))는,이 하나 : 당신이 이미 컨텍스트를 저장하고 있기 때문에

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

, 당신은 대신 new Intent(this.context, IntentA.class)를 사용하여 문제를 해결할 수 .

+0

나는 왜 생성자에 대한 인수가 View 클래스라고 생각하는지 모르겠습니다. 수정해 주셔서 감사합니다. 대신 _context_를 전달하고 정적 선언을 제거하면 효과적입니다! 고맙습니다! – stuckInOldLodiAgain

0
CustomListViewDemo.this 

this을 사용하려면 인스턴스가 필요합니다.

정적 중첩 클래스에는 외부 인스턴스가 없습니다.

"비 정적"클래스를 만들거나 여기에서 사용할 주변의 CustomListViewDemo 인스턴스에 대한 참조를 명시 적으로 전달해야합니다. 당신이 문서를 보면

+0

.. :

1) DMON의 제안에 가서 저장 한 컨텍스트를 사용할 수 있습니까? 또는 다른 답변에서 제안 된 리팩토링 중 하나를 수행하여 문제가되는 코드를 더 자연스럽게 맞출 수있는 장소로 옮깁니다. – Thilo

+0

고맙습니다. 저는 그것을 비 정적으로 만들고 올바른 필드 (컨텍스트)를 전달했습니다. – stuckInOldLodiAgain

0

EfficientAdapter은 정적 클래스이므로 아직 사용할 수있는 CustomListViewDemo의 인스턴스가있을 필요는 없습니다. 정적 당신은 여기에 두 가지 옵션이 있습니다 따라서 귀하의 오류

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

, 클래스가 인스턴스없이 을 사용할 수 있음을 의미한다.

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

2) EfficientAdapter가 정적을 갖는 이유가 무엇 정적 클래스 (하지 마십시오)

+1

dmon의 제안이 훌륭하게 작동했습니다. 감사합니다. Stackoverflow는 나를 이겼다. 내가 얻은 반응은 훌륭했고 아무도 내 초보자 질문에 불을 지폈다. 답장을 한 모든 사람에게 높이 평가되었습니다. – stuckInOldLodiAgain