如何在自定义ListView中动态添加项目而不擦除以前的项目


how to add items dynamically in custom ListView without erasing previous items

我正在从php url获取一些数据,并显示自定义ListView上的数据。在"类别"listView中,用户将选择一个类别复选框,并进一步根据所选项目,我正在从另一个url发送该项目的id以获取"子类别",我正在显示另一个listView中的子类别项目。但问题是,每当我点击另一个复选框的子类别项目由新获取的项目取代。我想显示与选定的"类别"复选框对应的所有子类别…求你了,求你帮帮我,我该怎么做?这里是onClickListener的"类别"复选框。

    holder.name.setOnClickListener( new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v ;
                        Category Category = (Category) cb.getTag();
                    /*Toast.makeText(getApplicationContext(),"Clicked on Checkbox: " + cb.getText() +" is " + cb.isChecked(),
                            Toast.LENGTH_LONG).show();*/
                        category_id=cb.getText().toString();
                        receiveSubCategory();
                        Category.setSelected(cb.isChecked());
                    }
                }); 

这是我如何获得值。private void receiveSubCategory(){

    StringRequest stringRequest = new StringRequest(Request.Method.POST,Sub_Cate_URL,new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //Log.d("sub response", response);
            receiveSubJSOn(response);
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    String er=error.getMessage();
                    Toast.makeText(UpdateUserProfile.this,er,Toast.LENGTH_LONG).show();
                    //Log.d("","error message"+er);
                }
            }){
    @Override
    protected Map<String,String> getParams(){
        Map<String,String> params = new HashMap<String, String>();
        params.put("category_id",category_id);
        return params;
    }
};

RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
private void receiveSubJSOn(String json){
    ParseJSON pj = new ParseJSON(json);
    pj.receiveSubCategory();
    sub_category_id=ParseJSON.sub_id;
    sub_cate_name=ParseJSON.sub_name;
    displaySubCategory();

这是我如何在listView上显示项目:private void displaySubCategory() {

    //Array list of categories
    ArrayList<SubCategory> CategoryList = new ArrayList<SubCategory>();
    //sub_category_id=temp_id;
    //sub_cate_name=temp_name;
    for(int i=0;i<sub_cate_name.length;i++) {
        SubCategory Category = new SubCategory(sub_cate_name[i], sub_category_id[i], false);
        CategoryList.add(Category);
    }
    //create an ArrayAdaptar from the String Array
    subCategory = new SubCategoryAdapter(this,R.layout.sub_category_items, CategoryList);
    ListView listView = (ListView) findViewById(R.id.sub_category_list);
    // Assign adapter to ListView
    listView.setAdapter(subCategory);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // When clicked, show a toast with the TextView text
            Category Category = (Category) parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),
                    "Clicked on Row: " + Category.getName(),
                    Toast.LENGTH_LONG).show();
        }
    });
}

这是我的适配器类私有类SubCategoryAdapter扩展ArrayAdapter {

    private ArrayList<SubCategory> CategoryList;
    private String[] ids;
    public SubCategoryAdapter(Context context, int textViewResourceId,ArrayList<SubCategory> CategoryList) {
        super(context, textViewResourceId, CategoryList);
        this.CategoryList = new ArrayList<SubCategory>();
        this.CategoryList.addAll(CategoryList);
        // ids=id;
    }
    private class ViewHolder {
        TextView code;
        CheckBox name;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        //Log.v("ConvertView", String.valueOf(position));
        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.sub_category_items, null);
            holder = new ViewHolder();
            holder.code = (TextView) convertView.findViewById(R.id.sub_list_text);
            holder.name = (CheckBox) convertView.findViewById(R.id.sub_category_checkbox);
            convertView.setTag(holder);
            holder.name.setOnClickListener( new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v ;
                    SubCategory Category = (SubCategory) cb.getTag();
                   /* Toast.makeText(getApplicationContext(),
                            "Clicked on Checkbox: " + cb.getText() +
                                    " is " + cb.isChecked()Toast.LENGTH_LONG).show();*/
                    Category.setSelected(cb.isChecked());
                }
            });
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        SubCategory Category = CategoryList.get(position);
        holder.code.setText(""+Category.getCode()+"");
        holder.name.setText(Category.getName());
        holder.name.setChecked(Category.isSelected());
        holder.name.setTag(Category);
        return convertView;
    }
}

下面是输出:复选框图片

试试这个:-

步骤1:在方法"displaySubCategory"中,从该方法中删除行"ArrayList CategoryList = new ArrayList();",并在该页面上全局添加相同的行。这会解决你的问题。但是为适配器创建多个实例并不是正确的方法。所以也要遵循第二步。

步骤2:在方法"displaySubCategory"中,您正在为SubCategoryAdapter创建新的实例"subCategory = new SubCategoryAdapter(this, r.b layout.)"。sub_category_items CategoryList);"

你应该只在一个页面中为适配器"SubCategoryAdapter"创建一次实例。

删除subCategory = new SubCategoryAdapter(this,R.layout. adapter)sub_category_items, CategoryList);"来自"displaySubCategory"方法。并在onCreateView/onCreate事件中添加相同的行。

在"displaySubCategory"方法中添加这行"subCategory.notifyDataSetChanged();"