Android listview sectionHeader:在单个文本视图中显示相关类别项目

Android listview sectionHeader:在单个文本视图中显示相关类别项目,android,listview,Android,Listview,我正在开发一个应用程序,在这个应用程序中,我得到了如下的JSON响应,服务的类别将显示在列表视图中,类别作为标题,服务作为行项目。目前其工作正常,但现在需要在单独的行/单独的项中显示行项目,而不是用逗号分隔 JSON [ { categoryId: 1 categoryName: "Automobile" serviceName: "Buy Sell" serviceId: 3 } { categoryId: 1 categoryName: "Automobile" serviceName:

我正在开发一个应用程序,在这个应用程序中,我得到了如下的JSON响应,服务的类别将显示在列表视图中,类别作为标题,服务作为行项目。目前其工作正常,但现在需要在单独的行/单独的项中显示行项目,而不是用逗号分隔

JSON

[
{
categoryId: 1
categoryName: "Automobile"
serviceName: "Buy Sell"
serviceId: 3
}

{
categoryId: 1
categoryName: "Automobile"
serviceName: "Wash"
serviceId: 5
}

{
categoryId: 1
categoryName: "Automobile"
serviceName: "Spare Parts"
serviceId: 2
}

{
categoryId: 3
categoryName: "Education"
serviceName: "Teaching"
serviceId: 1
}

{
categoryId: 7
categoryName: "Food"
serviceName: "Restaurant"
serviceId: 5
}
]
现在我想展示这些

即单个项/文本视图中的服务,以逗号分隔。目前,我对行项目使用单个文本视图。下面是我的自定义适配器代码

class CustomAdapter extends BaseAdapter {

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;
    LinearLayout linearLayout;

    private ArrayList<String> mData = new ArrayList<String>();
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>();
    private LayoutInflater mInflater;

    public CustomAdapter(Context context) {
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final String item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    public void addSectionHeaderItem(final String item) {
        mData.add(item);
        sectionHeader.add(mData.size() - 1);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
    }

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

    @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;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int rowType = getItemViewType(position);

        if (convertView == null) {
            holder = new ViewHolder();
            switch (rowType) {
                case TYPE_ITEM:
                    convertView = mInflater.inflate(R.layout.snippet_item1, null);
                    linearLayout = (LinearLayout) convertView.findViewById(R.id.parent);
                    holder.textView = (TextView) convertView.findViewById(R.id.text);
                    break;
                case TYPE_SEPARATOR:
                    convertView = mInflater.inflate(R.layout.snippet_item2, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.textSeparator);
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        switch (rowType) {
            case TYPE_ITEM:
                holder.textView.setText(mData.get(position));
                break;
            case TYPE_SEPARATOR:
                holder.textView.setText(mData.get(position));
                break;
        }

        return convertView;
    }

    public static class ViewHolder {
        public TextView textView;
    }
}
class CustomAdapter扩展了BaseAdapter{
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
线性布局线性布局;
private ArrayList mData=new ArrayList();
私有树集sectionHeader=新树集();
私人停车场;
公共CustomAdapter(上下文){
mInflater=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
}
公共无效附加项(最终字符串项){
mData.add(项目);
notifyDataSetChanged();
}
公共void addSectionHeaderItem(最终字符串项){
mData.add(项目);
sectionHeader.add(mData.size()-1);
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回段标题。包含(位置)?类型分隔符:类型项目;
}
@凌驾
public int getViewTypeCount(){
返回2;
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共字符串getItem(int位置){
返回mData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
int rowType=getItemViewType(位置);
if(convertView==null){
holder=新的ViewHolder();
开关(行类型){
案例类型\u项目:
convertView=mInflater.inflate(R.layout.snippet_item1,null);
linearLayout=(linearLayout)convertView.findViewById(R.id.parent);
holder.textView=(textView)convertView.findViewById(R.id.text);
打破
箱型分离器:
convertView=mInflater.inflate(R.layout.snippet_item2,null);
holder.textView=(textView)convertView.findViewById(R.id.textSeparator);
打破
}
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
开关(行类型){
案例类型\u项目:
holder.textView.setText(mData.get(position));
打破
箱型分离器:
holder.textView.setText(mData.get(position));
打破
}
返回视图;
}
公共静态类视图持有者{
公共文本视图文本视图;
}
}
由于getView()方法的行为,我真的陷入了困境,请告诉我如何通过使用上述代码实现这一点,我们将非常感谢您的帮助,提前感谢

编辑:

这就是我加载JSON的方式

first_loop = 1;
 try {
                for (int i = 0; i < ja.length(); i++) {
                    checkLoop++;
                    obj = ja.getJSONObject(i);
                    if (first_loop == 1) {
                        headerList.add("head");
                        currentCategory = obj.getString("categoryId");
                        adpter.addSectionHeaderItem(obj.getString("categoryName"));

                        adpter.addItem(obj.getString("serviceName"));
                        headerList.add("detail");

                        first_loop++;
                    } else {
                        if (currentCategory.equals(obj.getString("categoryId"))) {
                            currentCategory = obj.getString("categoryId");
                            adpter.addItem(obj.getString("serviceName"));
                            headerList.add("detail");
                        } else {
                            headerList.add("head");
                            currentCategory = obj.getString("categoryId");
                            adpter.addSectionHeaderItem(obj.getString("categoryName"));
                            adpter.addItem(obj.getString("serviceName"));
                            headerList.add("detail");
                        }
                    }
                }

                if (checkLoop <= 0){
                    headeradpter.addSectionHeaderItem("");
                    headeradpter.addItem("N/A");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
first_loop=1;
试一试{
对于(int i=0;i如果(checkLoop),我认为您需要更改JSON响应以获得更好的性能。您可以发布代码加载JSON吗?@tangba我正在编辑答案,请参阅。