Unable to use LayoutInflater in custom adapter

后端 未结 4 1117
太阳男子
太阳男子 2021-01-02 10:48

I\'m looking into writing a custom adapter to populate a listview with 3 textviews per line. I\'ve found quite a bit of example code to do this, but the one that seemed the

4条回答
  •  醉梦人生
    2021-01-02 11:18

    @Axel22's answer is key, but there are a few other things missing from your code. First, you should be extending either BaseAdapter or ArrayAdapter, depending on your preference. Second, you want to get in the practice of using a ViewHolder to avoid making excessive calls to findViewById, and (most importantly) recycling your View.

    private Class ViewHolder {
      public TextView cityControl;
      public TextView temperatureControl;
      public ImageView skyControl;
      public ViewHolder(TextView cityControl, TextView temperatureControl, ImageView skyControl) {
        this.cityControl = cityControl;
        this.temperatureControl = temperatureControl;
        this.skyControl = skyControl;
      }
    

    Your getView function can recycle views and utilize the ViewHolder class as follows:

    public View getView(int position, View convertView, ViewGroup parent) { 
        Weather weather = weatherList.get(position);
        // This is how you attempt to recycle the convertView, so you aren't 
        // needlessly inflating layouts.
        View v = convertView;
        ViewHolder holder;
        if (null == v) {
            v = LayoutInflater.from(getContext()).inflate(R.layout.weather_row, parent, false);
            TextView cityControl = (TextView)v.findViewById( R.id.city );
            TextView temperatureControl = (TextView)v.findViewById( R.id.temperature );
            ImageView skyControl = (ImageView)v.findViewById( R.id.sky );
            holder = new ViewHolder(cityControl, temperatureControl, skyControl);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
    
        holder.cityControl.setText("Metropolis");
        holder.temperatureControl.setText("78");
        holder.skyControl.setImageResource(R.drawable.daily_planet);
    
        return v;
    

    }

    For tons more examples (and other optimization tips), see this blog post (or just google for ViewHolder).

提交回复
热议问题