web-dev-qa-db-fra.com

Obtention du contexte Android dans un adaptateur

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.

49
Gautam

L'obtention du contexte dans le constructeur présente (au moins) trois avantages:

  1. Vous ne le faites qu'une seule fois, pas à chaque fois, getView() est appelée.
  2. Vous pouvez également l'utiliser à d'autres fins, si nécessaire.
  3. Cela fonctionne également lorsque parent est null.

Cependant, si vous n'avez aucun problème avec votre solution, autant vous y tenir.

33
Ridcully

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);
2
Dmitry Zaytsev

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

2
wyx

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

0
Exel Staderlin