【问题标题】:Custom listview section header自定义列表视图部分标题
【发布时间】:2018-02-16 12:02:05
【问题描述】:

我有一个使用自定义数组适配器填充的列表视图。我想添加部分标题以按日期列出视图项目,这是对象中的一个值。 我的适配器类是

public class ReceiptAdapter2 extends BaseAdapter {

Context context;
LayoutInflater inflater;
private ArrayList<ReceiptModel> planList;

public ReceiptAdapter2(Context applicationContext, ArrayList<ReceiptModel> planList) {
    this.context = applicationContext;
    this.planList = planList;
    inflater = (LayoutInflater.from(applicationContext));
}


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

@Override
public int getItemViewType(int position) {
    if (getItem(position) instanceof SectionItem){
        return 0;
    }else{
        return 1;
    }
}

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

@Override
public Object getItem(int i) {
    return  planList.get(i);
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    ReceiptModel model = planList.get(i);
    view = inflater.inflate(R.layout.snipadapt, null);
    TextView names = (TextView) view.findViewById(R.id.textView);
    names.setText(model.getName());
    return view;
}
}

MainActivity 代码

 if (hstry.length() > 0 && hstry != null) {
            for (int i = 0; i < hstry.length(); i++) {
                try {
                    history_data = hstry.getJSONObject(i);
                    model = new ReceiptModel();
                    model_section = new SectionItem();

                    model.setRid(history_data.optString("ID"));
                    model.setName(history_data.optString("Name"));
                    model.setMobile(history_data.optString("Mobile"));
                    model.setTax(history_data.optString("Tax"));
                    model.setQnt(history_data.optString("T_quantity"));
                    model.setPrice(history_data.optString("T_price"));
                    model.setSub(history_data.optString("Sub_total"));
                    model.setDiscount(history_data.optString("Discount"));
                    model.setType(history_data.optString("Payment_type"));
                    model.setDate(db.getCatColor(history_data.optString("Date")));
                    model_section.setDevice(db.getCatColor(history_data.optString("Date")));


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            setAdapter();

        }

设置适配器

 private void setAdapter() {
    adapter = new ReceiptAdapter2(context,planList);
    category_list.setAdapter(adapter);
}

模型类

public class ReceiptModel {

private String id,name,mobile,tax,t_quantity,t_price,s_total,discount,date,type;
private String device;
private String os,location;
private String network,weather,storage,time,internal,cat_id;

public String getRid() {
    return id;
}

public void setRid(String id) {
    this.id = id;
}


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


public String getMobile() {return mobile; }

public void setMobile(String mobile) {this.mobile = mobile; }

public String getTax() {return tax; }

public void setTax(String tax) {this.tax = tax; }

public String getQnt() {return t_quantity; }

public void setQnt(String t_quantity) {this.t_quantity = t_quantity; }

public String getPrice() {return t_price; }

public void setPrice(String t_price) {this.t_price = t_price; }

public String getSub() {return s_total; }

public void setSub(String s_total) {this.s_total = s_total; }

public String getDiscount() {return discount; }

public void setDiscount(String discount) {this.discount = discount; }

public String getDate() {return date; }

public void setDate(String date) {this.date = date; }

}

我参考了许多教程,但对我没有用。我如何将多个数组列表传递给适配器类?感谢您的回复

【问题讨论】:

    标签: android listview android-arrayadapter sectionheader


    【解决方案1】:

    您需要将您的两个模型 ReceiptModel() 和 SelectionItem() 添加为这样的 ArrayList 的对象

    private ArrayList<Object> lpAndAlp=new ArrayList<>();
    
     lpAndAlp.add("model");
     lpAndAlp.add("model_section");
    

    然后在你的适配器中lpAndAlp

     private void setAdapter() {
        adapter = new ReceiptAdapter2(context,planList);
        category_list.setAdapter(adapter);
    }
    

    并像这样将其称为您的适配器类..

    private ArrayList<Object> planList;
    
        public ReceiptAdapter2(Context applicationContext, ArrayList<Object> planList) {
            this.context = applicationContext;
            this.planList = planList;
            inflater = (LayoutInflater.from(applicationContext));
        }
    

    您只需检查 getView 中 getItemViewType 方法的返回类型

     @Override
            public View getView ( int i, View view, ViewGroup viewGroup){ 
                int type = getItemViewType(position);
                if (view == null) {
                    switch (type) {
                        case 0:
                            view = inflater.inflate(R.layout.snipadapt, parent, false);
                            break;
                        case 1:
                            view = inflater.inflate(R.layout.yourHeaderLayout, parent, false);
                            break;
                    }
                }
    
                switch (type) {
                    case 0:
                        ReceiptModel model = planList.get(i);
                        view = inflater.inflate(R.layout.snipadapt, null);
                        TextView names = (TextView) view.findViewById(R.id.textView);
                        names.setText(model.getName());
                        break;
                    case 1:
                        SectionItem model_section = planList.get(i);
                        //your header
                        break;
                }
    
    
                return view;
            }
    

    【讨论】:

    • 但是如何将部分标题添加到列表视图?
    • 您需要再创建一个标题布局并调用您的getView 方法
    • 我想要的是添加日期明智的部分标题,但是当我更改日期更改的视图时,该位置的值将替换为日期标题。怎么可以同时header和row?
    【解决方案2】:

    在 ReceiptAdapter2 中

    @Override
      public int getItemViewType(int position) {
    
         //CHECK IF CURRENT ITEM IS List THEN RETURN ROW
        if(getItem(position) instanceof LISTSECTION)
        {
          return ROW;
        }
    
         //OTHERWISE RETURN HEADER
        return HEADER;
      }
    

    在getView方法中:--- >

     @Override
      public View getView(int pos, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
    
          //TYPE OF VIEW
        int type=getItemViewType(pos);
    
        //IF THERE IS NO VIEW CREATE IT
        if(convertView==null)
        {
          inflater=(LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
          switch (type) {
          case ROW:
            convertView=inflater.inflate(R.layout.rowmodel, null);
            break;
           case HEADER:
                  convertView=inflater.inflate(R.layout.headermodel,null);
          default:
            break;
          }
        }
    
         //OTHERWISE CHECK IF ITS ROW OR HEADER AND SET DATA ACCORDINGLY
        switch (type) {
        case ROW:
    
         // Row data
    
    
    
          break;
        case HEADER:
          //header data
    
        default:
          break;
        }
    
        return convertView;
      }
    

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多