【问题标题】:android ListView adapter with three different xml items具有三个不同 xml 项的 android ListView 适配器
【发布时间】:2014-07-24 18:49:23
【问题描述】:

我正在尝试创建一个包含三种不同项目类型的列表视图我有一个适用于两个 XML 文件的代码

这是适配器代码:

 private class MyCustomAdapter extends ArrayAdapter<String> {
    String hello;
    private String place;
    int image;
    private String temp;
    private String humidity;
    private String windspeed;
    private String condition;
    private int imageTop;

    private String time;
    private static final int TYPE_WEATHER = 0;
    private static final int TYPE_TIME = 1;
    private static final int TYPE_TOP = 2;
    private static final int TYPE_MAX_COUNT = 3 + 1;

    private ArrayList<String> mData = new ArrayList<String>();

    private LayoutInflater mInflater;

    private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();

    public MyCustomAdapter(Context context, int resource) {
        super(context, resource);
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addWeather(final String place,final int image , final String temp,final String humidity,final String windspeed,final String condition) {
        mData.add(place);
        this.place = place;
        this.image = image;
        this.temp = temp;
        this.humidity = humidity;
        this.windspeed = windspeed;
        this.condition = condition;
        notifyDataSetChanged();
    }

    public void addFavapp(final String helloworld){
        mData.add(place);
        this.hello = helloworld;
        notifyDataSetChanged();
    }


    public void addItem(final String item) {
        this.time = item;
        mData.add(item);
        // save separator position
        mSeparatorsSet.add(mData.size() - 1);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return mSeparatorsSet.contains(position) ? TYPE_WEATHER : TYPE_TIME;
    }

    @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public String getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int type = getItemViewType(position);
        System.out.println("getView " + position + " " + convertView + " type = " + type);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case TYPE_WEATHER:
                    convertView = mInflater.inflate(R.layout.weather_item, null);
                    //Handling xml file weather_item
                    break;
                case TYPE_TIME:
                    convertView = mInflater.inflate(R.layout.time_card_item, null);
                    holder.textView = (TextView)convertView.findViewById(R.id.two);
                    holder.textView.setText(time);
                    break;
                case TYPE_TOP:
                    convertView = mInflater.inflate(R.layout.top_card_item, null);
                    //Handling xml file top_card_item

                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        return convertView;
    }

}

public static class ViewHolder {
    public TextView textView;
    public ImageView image;
    public TextView txtTemp;
    public ImageView imageView;
    public  TextView txthumidity;
    public TextView txtWind;
    public TextView txtCond;
}

我尝试创建一个名为“addFavapp”的方法来添加我的第三个 XML 文件,但我无法让它工作。

请帮忙。

【问题讨论】:

  • 究竟是什么不起作用?有什么错误吗?是否有任何视图加载? getItemViewType() 只返回 2 种视图类型。
  • 我没有收到任何错误,但 time_card_item 显示两次,一次在顶部一次在底部我将添加一张图片
  • 我相信这是因为您只从 getItemViewType() 返回了 3 种视图类型中的 2 种。并且默认返回值为TYPE_TIME。
  • 那我应该改成返回 3 吗?
  • 好吧,现在 TYPE_TOP 的 case 语句将永远无法到达。 getItemViewType() 只返回 TYPE_WEATHER 和 TYPE_TIME。您需要弄清楚如何确定 TYPE_TOP 何时执行。除非我读错了你的代码。

标签: android xml listview android-arrayadapter android-adapter


【解决方案1】:

通过替换修复它

        return mSeparatorsSet.contains(position) ? TYPE_WEATHER : TYPE_TIME;

getItemViewType 内部

        return position;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多