2012-08-27 43 views
39

Trong nhiều mẫu mã tôi tìm thấy trên internet, context được lấy trong bộ tạo của bộ điều hợp.Lấy bối cảnh android trong bộ điều hợp

Ngữ cảnh này được sử dụng để có được inflater để tăng lượt xem trong phương thức getView.

Câu hỏi của tôi là lý do tại sao bận tâm nhận được ngữ cảnh trong constructor khi nó có thể dễ dàng thu được như vậy

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

Ngoài ra là có lý do nào đó không sử dụng các phương pháp trên vì nó cho đến bây giờ tôi vẫn chưa phải đối mặt với bất kỳ vấn đề khi sử dụng nó.

+3

nếu bạn không có cha mẹ? – Blackbelt

+1

bạn có thể trực tiếp sử dụng 'LayoutInflater' bằng' getLayoutInflater() 'của Hoạt động của bạn. –

Trả lời

27

Lấy bối cảnh trong các nhà xây dựng có (ít nhất) ba lợi thế:

  1. Bạn chỉ làm điều đó một lần, không phải mọi lúc, getView() được gọi.
  2. Bạn cũng có thể sử dụng nó cho các mục đích khác khi cần.
  3. Nó cũng hoạt động, khi parentnull.

Tuy nhiên, nếu bạn không gặp bất kỳ vấn đề nào với giải pháp của mình, bạn cũng có thể quan tâm đến giải pháp đó.

+2

- Tôi không nhận được bối cảnh mỗi lần 'getView' được gọi, chỉ khi inflater là null - Cá nhân tôi chưa bao giờ cần bối cảnh bất cứ nơi nào bên ngoài' getview' - Phụ huynh được dường như vô hiếm, nhưng đây là một điểm hợp lệ – Gautam

+0

@GautamK, bạn nói đúng, tôi đã bỏ lỡ điều đó. – Ridcully

1

Điều gì sẽ xảy ra nếu ai đó tạo lớp học sử dụng BaseAdapter để lưu trữ Chế độ xem ở đâu đó (và, có thể, nó sẽ đính kèm chúng vào cha mẹ sau)? Trong trường hợp này, parent có thể là null.

Nó không phải là một vấn đề lớn như vậy, quyết định cho chính mình những gì là tốt hơn.

Ví dụ:

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

Và sau đó bạn có thể làm với quan điểm này bất cứ điều gì bạn muốn:

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

Đó thực sự là một điểm thú vị, nhưng bạn có thể vui lòng xây dựng với một số mã để tôi hoàn toàn có thể hiểu được – Gautam

+0

@GautamK ở đây là một ví dụ –

+1

Trong bài trình bày của 'Romain Guy' và 'Adam Powell', Họ khuyên không nên sử dụng địa phương xem bộ nhớ cache http://dl.google.com/googleio/2010/android-world-of-listview-android.pdf – Gautam

1

Dưới đây là một ví dụ:

@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); 
    } 
} 

Bạn có thể lấy bối cảnh của view.getContext() in the Holder

Các vấn đề liên quan