Intereting Posts
Готовы ли Android Studio к производству? Как преобразовать double в 2 числа после точки? Проблемы с качеством при изменении размера изображения во время выполнения Как заставить клавиатуру с цифрами на мобильном сайте в Android Включить / отключить масштабирование в Android WebView Есть ли способ определить, какая сотовая сеть используется на Android? Не найден ресурс, который соответствует указанному имени: attr 'android: keyboardNavigationCluster'. При обновлении до Support Library 26.0.0 Студия Android говорит «Empty Test Suite» для AndroidTestCase Почему значение тайм-аута не соблюдается андроидом HttpURLConnection? Изображение из камеры или галереи? Не удалось установить HelloAndroid.apk на эмулятор устройства-5554! Брандмауэр для Android с VpnService. Ответы передаются, но исключение SocketTimeoutException Круглый Android Wear Emulator – квадрат Невозможно разрешить символ «Тема» в styles.xml (Android Studio) Изменение цвета панели действий в android

Получение контекста 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