2016-10-28 9 views
0

Я получаю некоторые данные с php url и показывая эти данные в Custom ListView. В списке категорий «category» пользователь выберет категорию и, в соответствии с выбранным пунктом, я отправлю идентификатор этого элемента из другого URL-адреса, чтобы получить «subCategories», и я показываю, что элементы подкатегории в другом спискеView. Но проблема в том, что когда я нажимаю на другой флажок, элементы подкатегории заменяются новыми элементами. Я хочу показать все подкатегории, соответствующие выбранным флажкам категории. Пожалуйста, помогите мне, как я могу это сделать? здесь onClickListener для «категории».Как добавить элементы динамически в пользовательский ListView без удаления предыдущих элементов.

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()); 
        } 
       }); 

Вот как я получаю значения. частная пустота 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: частный недействительным 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; 

    } 

} 

здесь Выход: checkboxes image

ответ

0

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

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

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

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

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

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

+0

thnk u so much @sabari для вашего ответа. Я получил желаемый результат, используя первый метод, и он отлично работает. Но всякий раз, когда я пытаюсь использовать второй метод, он дает исключение «arrayIndexOutOfBound». Но все же у меня есть представление о неправильных вещах в моем коде ... :) –

+0

@RBoughan, это не второй метод. Это второй шаг. Если вы выполните первый шаг, он исправит вашу проблему. Но создание нескольких экземпляров для адаптера на одной странице неверно. Поэтому я предложил вам выполнить оба действия. Извините за мой плохой английский. – Sabari

+0

kk, тогда я это выясню. поблагодарить u @Sabari –