2012-08-27 8 views
39

인터넷에서 찾은 많은 코드 샘플에서 context은 어댑터 생성자에서 가져옵니다.어댑터의 안드로이드 컨텍스트 얻기

inflatergetView 방법으로보기를 부 풀리는 데 사용됩니다.

내 질문은 왜 지금까지 내가 어떤 직면하지 않았기 때문에 위의 방법을 사용하지 않는 어떤 이유가 그것을 쉽게 그리고 너무

 LayoutInflater inflater; 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(inflater == null){ 
      Context context = parent.getContext(); 
      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 
      ... 
      ... 

      return convertView; 
     } 

같이 얻을 수 있습니다 때 생성자의 컨텍스트를 받고 귀찮게 문제.

+3

하여 컨텍스트를 얻을 수 있습니다 당신은 부모가없는 경우 : 여기 – Blackbelt

+1

당신의 Activity의'getLayoutInflater()'에 의해'LayoutInflater'를 직접 사용할 수 있습니다. –

답변

27

생성자의 컨텍스트를 취득 (적어도)이 세 가지 장점 :

  1. 매번이 아니라 한 번만 수행하면 getView()이 호출됩니다.
  2. 필요한 경우 다른 용도로도 사용할 수 있습니다.
  3. parentnull 일 때도 작동합니다.

그러나 솔루션에 아무런 문제가 없다면 문제가 될 수 있습니다.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    Holder holder; 
    if (view == null) { 
     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_job, parent, false); 
     holder = new Holder(view, this); 
     view.setTag(holder); 
    } else { 
     holder = (Holder) view.getTag(); 
    } 

    holder.parse(getItem(position), position); 
    return view; 
} 

public class Holder { 

    @Bind(R.id.type) 
    TextView type; 
    @Bind(R.id.date_time) 
    TextView dateTime; 
    @Bind(R.id.grade) 
    TextView grade; 

    public Holder(View view) { 
     ButterKnife.bind(this, view); 
    } 

    public void parse(final GetGradeHistoryResponse.GradeHistory item) { 
     if (item.grade < 0) { 
      grade.setTextColor(App.getInstance() 
        .getResources().getColor(R.color.withdraw_status)); 
      grade.setText(String.valueOf(item.grade)); 
     } else { 
      grade.setTextColor(App.getInstance() 
        .getResources().getColor(R.color.primary)); 
      grade.setText("+" + String.valueOf(item.grade)); 
     } 

     type.setText(item.type); 
     dateTime.setText(item.datetime); 
    } 
} 

당신은 view.getContext() in the Holder

+2

- 풍선 도움말이 null 일 때만 getView가 호출 될 때마다 컨텍스트를 얻지 못합니다. - 개인적으로'getview' 외부에서 컨텍스트를 필요로하지 않았습니다. - 부모가 null 인 것 같지만 이것은 드뭅니다. 유효한 포인트 – Gautam

+0

@ GautamK, 맞아, 나는 그것을 놓쳤다. – Ridcully

1

누군가가 BaseAdapter을 사용하여보기를 어딘가에 저장하는 클래스를 만드는 경우 (나중에 부모에게 연결하는 경우) 어떻게해야합니까? 이 경우 parentnull 일 수 있습니다.

큰 문제는 아니며, 무엇이 더 나은지 스스로 결정하십시오.

예를 들어

:

public class MockWithAdapter{ 

    private BaseAdapter mAdapter; 

    public MockWithAdapter(BaseAdapter adapter){ 
     mAdapter = adapter; 
    } 

    public List<View> mock(){ 
     int size = mAdapter.getCount(); 
     List<View> views = new ArrayList(size); 
     for(int i=0; i<size; i++) 
      views.add(mAdapter.getView(i, null, null)); 

     return views; 
    } 
} 

을 그리고 당신은 당신이 원하는대로이 전망 수행 할 수 있습니다

MockWithAdapter m = new MockWithAdapter(adapter); 
ListView lv = new ListView(context); 
for(View v : m.mock) 
    lv.addView(v); 
+0

실제로 흥미로운 점이 있지만 완전히 이해할 수 있도록 몇 가지 코드로 자세히 설명해주십시오. – Gautam

+0

@GautamK 여기가 예 –

+1

'Romain Guy'와 'Adam Powell'의 프레젠테이션에서 지역 사용에 대한 조언 캐시보기 http://dl.google.com/googleio/2010/android-world-of-listview-android.pdf – Gautam

1

은 예입니다?
관련 문제