在适配器中获取android上下文

android android-adapter android-context

47595 观看

4回复

4912 作者的声誉

在我在互联网上找到的许多代码示例中,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;
        }

也有任何理由不使用上述方法,因为直到现在我还没有遇到任何使用它的问题。

作者: Gautam 的来源 发布者: 2012 年 8 月 27 日

回应 4


2

17499 作者的声誉

如果有人会创建一个用于BaseAdapter在某处存储视图的类(并且可能会稍后将它们附加到父级),该怎么办?在这种情况下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);
作者: Dmitry Zaytsev 发布者: 2012 年 8 月 27 日

33

19251 作者的声誉

决定

在构造函数中获取Context具有(至少)三个优点:

  1. 你只会做一次,而不是每次都getView()被召唤。
  2. 您也可以在需要时将其用于其他目的。
  3. 它也可以,如果parentnull

但是,如果您的解决方案没有任何问题,您可以坚持下去。

作者: Ridcully 发布者: 2012 年 8 月 27 日

2

958 作者的声誉

这是一个例子:

@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

作者: wyx 发布者: 2015 年 12 月 18 日

0

158 作者的声誉

就这么简单!!

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

}

要获取上下文,请使用itemView.context

作者: Exel Staderlin 发布者: 2019 年 6 月 21 日
32x32