Dans de nombreux exemples de code que je trouve sur Internet, le context
est obtenu dans le constructeur d'un adaptateur.
Ce contexte est utilisé pour obtenir un inflater
pour gonfler les vues dans la méthode getView
.
Ma question est pourquoi s'embêter à obtenir le contexte dans le constructeur quand il peut être facilement obtenu comme ça
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;
}
Y a-t-il également une raison de ne pas utiliser la méthode ci-dessus, car jusqu'à présent, je n'ai rencontré aucun problème pour l'utiliser.
L'obtention du contexte dans le constructeur présente (au moins) trois avantages:
getView()
est appelée.parent
est null
.Cependant, si vous n'avez aucun problème avec votre solution, autant vous y tenir.
Que se passe-t-il si quelqu'un crée une classe qui utilise BaseAdapter
pour stocker les vues quelque part (et, peut-être, les rattachera-t-il au parent plus tard)? Dans ce cas, parent
peut être null
.
Ce n'est pas un gros problème, décidez par vous-même de ce qui est mieux.
Par exemple:
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;
}
}
Et puis vous pouvez faire avec ces vues ce que vous voulez:
MockWithAdapter m = new MockWithAdapter(adapter);
ListView lv = new ListView(context);
for(View v : m.mock)
lv.addView(v);
Voici un exemple:
@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);
}
}
Vous pouvez obtenir le contexte par view.getContext() in the Holder
Juste simple comme ça !!
class RecentlyAdapter(var data: List<String>) : Adapter<RecentlyAdapter.HomeViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.card_recently_played, parent, false)
return HomeViewHolder(view)
}
override fun getItemCount(): Int {
return data.size
}
override fun onBindViewHolder(holder: HomeViewHolder, position: Int) {
}
class HomeViewHolder(itemView: View): ViewHolder(itemView) {
init {
itemView.setOnClickListener {
val intent = Intent(itemView.context, MusicPlayerActivity::class.Java)
itemView.context.startActivity(intent)
}
}
}
}
Pour obtenir le contexte, utilisez itemView.context