Intereting Posts

Получение контекста android в адаптере

Во многих образцах кода, которые я нашел в Интернете, context получен в конструкторе адаптера.

Этот контекст используется, чтобы получить inflater для раздувания представлений в методе getView .

Мой вопрос – зачем беспокоиться о создании контекста в конструкторе, когда его можно легко получить так,

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

Также есть причина не использовать вышеупомянутый метод, потому что до сих пор я не сталкивался с какой-либо проблемой при его использовании.

Solutions Collecting From Web of "Получение контекста android в адаптере"

Получение Контекста в конструкторе имеет (по крайней мере) три преимущества:

  1. Вы делаете это только один раз, не каждый раз, getView() .
  2. Вы можете использовать его и для других целей, когда это необходимо.
  3. Он также работает, когда parent имеет значение null .

Однако, если у вас нет проблем с вашим решением, вы можете также придерживаться его.

Что делать, если кто-то создаст класс, который использует BaseAdapter для хранения Views где-нибудь (и, возможно, он будет прикреплять их к родителям позже)? В этом случае parent может быть null .

Это не такая уж большая проблема, решите для себя, что лучше.

Например:

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

Вот пример:

 @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