как динамически добавлять элементы в пользовательский ListView, не стирая предыдущие элементы

я выбираю некоторые данные из php url и показываю эти данные в Custom ListView. В listView «категория» пользователь устанавливает флажок категории, и далее в соответствии с выбранным элементом я отправляю идентификатор этого элемента из другого URL-адреса, чтобы получить «подкатегории», и я показываю элементы этой подкатегории в другом 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;

}

}

Вот вывод:
изображение флажков

0

Решение

Попробуй это:-

Шаг 1:
В методе «displaySubCategory» удалите строку «ArrayList CategoryList = new ArrayList ();» из этого метода и добавить ту же строку глобально на этой странице. Это исправит вашу проблему. Но создание нескольких экземпляров для адаптера не является правильным способом. Так что следуйте и второму шагу.

Шаг 2:
В методе «displaySubCategory» вы создаете новые моменты для SubCategoryAdapter «subCategory = new SubCategoryAdapter (this, R.layout.sub_category_items, CategoryList);»

Вы должны создавать моменты для адаптера «SubCategoryAdapter» только один раз на странице.

Удалите строку «subCategory = new SubCategoryAdapter (this, R.layout.sub_category_items, CategoryList);» из метода «displaySubCategory». И добавьте ту же строку в событие onCreateView / onCreate.

Добавьте эту строку «subCategory.notifyDataSetChanged ();» в методе «displaySubCategory».

0

Другие решения

Других решений пока нет …