2015-10-23 22 views
8

Chcę poznać stan checkbox w rozwijanym widoku listy w moich danych aplikacji pochodzą z serwera.Jak uzyskać stan checkbox w rozszerzalnym widoku listy w Androidzie

Moja ProductsCategory.java: -

public class ProductsCategory extends AppCompatActivity { 

    private ListView listView; 
    private GridView gridView; 
    ProductsAdapter adapter; 
    ProductsAdapterGridView adapterGridView; 
    ArrayList<Products> productsList = new ArrayList<>(); 
    String menu_id; 
    TextView textView,textViewfilter; 

    // Filter Class 
    ExpandableListAdapter listAdapter; 
    ExpandableListView expListView; 
    List<String> listDataHeader = new ArrayList<>(); 
    HashMap<String, List<String>> listDataChild = new HashMap<>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.produts_category); 

     Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setTitle("Shopping Mazza"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     Intent i = getIntent(); 
     menu_id = i.getStringExtra("category"); 
     adapter = new ProductsAdapter(ProductsCategory.this,R.layout.product_page_list_view,productsList); 
     adapterGridView = new ProductsAdapterGridView(ProductsCategory.this,R.layout.products_page_grid_view,productsList); 
     expListView = (ExpandableListView) findViewById(R.id.filter_expandable_list_view); 
     listView = (ListView)findViewById(R.id.list_product); 
     gridView = (GridView)findViewById(R.id.list_product_grid); 
     textView = (TextView)findViewById(R.id.change_view); 
     textViewfilter = (TextView)findViewById(R.id.textView); 

     textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(listView.getVisibility()==View.VISIBLE){ 
        listView.setVisibility(View.GONE); 
        gridView.setVisibility(View.VISIBLE); 
       } 
       else { 
        listView.setVisibility(View.VISIBLE); 
        gridView.setVisibility(View.GONE); 
       } 
      } 
     }); 

     textViewfilter.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (expListView.getVisibility() == View.VISIBLE) { 

        listDataHeader.clear(); 
        listDataChild.clear(); 

        listAdapter = new ExpandableListAdapter(ProductsCategory.this, listDataHeader, listDataChild); 
        expListView.setAdapter(listAdapter); 

        listAdapter.notifyDataSetChanged(); 
        expListView.setVisibility(View.GONE); 
       } 
       else { 
         expListView.setVisibility(View.VISIBLE); 

        // preparing list data 
        // prepareListData(); 
        new PrepareListData().execute("http://opencart.codeniques.com/shopping/?route=feed/web_api/filters&key=test123$"); 

        // Listview Group click listener 
        expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 

         @Override 
         public boolean onGroupClick(ExpandableListView parent, View v, 
                int groupPosition, long id) { 
          // Toast.makeText(getApplicationContext(), 
          // "Group Clicked " + listDataHeader.get(groupPosition), 
          // Toast.LENGTH_SHORT).show(); 
          return false; 

         } 
        }); 

        // Listview Group expanded listener 
        expListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 

         @Override 
         public void onGroupExpand(int groupPosition) { 
          Toast.makeText(getApplicationContext(), 
            listDataHeader.get(groupPosition) + " Expanded", 
            Toast.LENGTH_SHORT).show(); 
         } 
        }); 

        // Listview Group collasped listener 
        expListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { 

         @Override 
         public void onGroupCollapse(int groupPosition) { 
          Toast.makeText(getApplicationContext(), 
            listDataHeader.get(groupPosition) + " Collapsed", 
            Toast.LENGTH_SHORT).show(); 

         } 
        }); 

        // Listview on child click listener 
        expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 

         @Override 
         public boolean onChildClick(ExpandableListView parent, View v, 
                int groupPosition, int childPosition, long id) { 

          Toast.makeText(
            getApplicationContext(), 
            listDataHeader.get(groupPosition) 
              + " : " 
              + listDataChild.get(
              listDataHeader.get(groupPosition)).get(
              childPosition), Toast.LENGTH_SHORT) 
            .show(); 
          return false; 
         } 
        }); 

       /* Intent i = new Intent(ProductsCategory.this,FilterClass.class); 
        i.putExtra("category_id",menu_id); 
        startActivity(i);*/ 
       } 
      } 
     }); 

     new Product().execute("http://opencart.codeniques.com/shopping/?route=feed/web_api/products&key=test123$"); 
    } 
    public class PrepareListData extends AsyncTask<String,Void,Void>{ 
     ProgressDialog dialog; 
     @Override 
     protected synchronized void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(ProductsCategory.this); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     @Override 
     protected synchronized Void doInBackground(String... params) { 
      try { 
       HttpClient client = new DefaultHttpClient(); 
       HttpPost post = new HttpPost(params[0]); 
       List<NameValuePair> nameValuePairs = new ArrayList<>(1); 

       nameValuePairs.add(new BasicNameValuePair("category",menu_id)); 
       post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       HttpResponse response = client.execute(post); 

       if(response.getStatusLine().getStatusCode()==200){ 

        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 

        JSONObject jsonObject = new JSONObject(data); 
        JSONArray jsonArray = jsonObject.getJSONArray("filters"); 

        //  Log.d("jsonarray",jsonArray.length()+""); 

        Log.d("filter",jsonArray+""); 

        for(int i=0;i<jsonArray.length();i++){ 

         JSONObject jsonObject1 = jsonArray.getJSONObject(i); 

         String s = jsonObject1.getString("filter_group_id"); 
         listDataHeader.add(jsonObject1.getString("name")); 

         JSONArray jsonArray1 = jsonObject1.getJSONArray("filter"); 

         List<String> firstlevel = new ArrayList<>(); 
         for(int j=0;j<jsonArray1.length();j++){ 

          JSONObject jsonObject11 = jsonArray1.optJSONObject(j); 

          String s1 = jsonObject11.getString("filter_id"); 
          String colorcode = jsonObject11.getString("colorcode"); 
          firstlevel.add(jsonObject11.getString("name")); 
         } 
         listDataChild.put(listDataHeader.get(i), firstlevel); 
         Log.d("listDataHeader", listDataHeader.get(i)+""); 
         Log.d("value of", firstlevel + ""); 
         Log.d("hash map", listDataChild.size() + ""); 
         // firstlevel.clear(); 
        } 
       } 
      }catch (IOException |JSONException e){ 
       Log.e("Error :", e.getMessage()); 
      } 
      return null; 
     } 
     @Override 
     protected synchronized void onPostExecute(Void aVoid) { 
      // super.onPostExecute(aVoid); 
      dialog.dismiss(); 
      listAdapter = new ExpandableListAdapter(ProductsCategory.this, listDataHeader, listDataChild); 
      // setting list adapter 
      expListView.setAdapter(listAdapter); 

     } 
    } 

Moja ExpandableListAdapter: -

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<String> listDataHeader, 
           HashMap<String, List<String>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item_filter, null); 


     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.lblListItem); 

     txtListChild.setText(childText); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_group_filter, null); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 

     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 
} 

Chcę wiedzieć, który przycisk jest sprawdzane pole i nazwać methods.One userdefine więcej rzecz, kiedy zaznaczam pole wyboru i zwiniętą grupę, a następnie ponownie rozszerzam grupę, zmienia się pozycja pola wyboru.

daję migawkę zarówno Stanowisko: -

enter image description here

kiedy collasped i ponownie rozszerzyła pozycja pole wyboru jest zmiana.

enter image description here

+0

Czy udzielona odpowiedź działa dla Ciebie? Jeśli nie to, czego brakuje/niejasno? –

Odpowiedz

15

To jest rzeczywiście podobna do ListView z wyboru. Musisz wewnętrznie zapamiętywać stan (np. Za pomocą tablicy lub zestawu boolowskiego) i zapewnić getter na stanie.

  1. Get pole z układu dziecka i dodać detektor

    public class ExpandableListAdapter extends BaseExpandableListAdapter { 
        ... 
        private final Set<Pair<Long, Long>> mCheckedItems = new HashSet<Pair<Long, Long>>(); 
        ... 
        public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    
         ... 
    
         final CheckBox cb = (CheckBox) convertView.findViewById(R.id.your_checkbox_id); 
         // add tag to remember groupId/childId 
         final Pair<Long, Long> tag = new Pair<Long, Long>(
          getGroupId(groupPosition), 
          getChildId(groupPosition, childPosition)); 
         cb.setTag(tag); 
         // set checked if groupId/childId in checked items 
         cb.setChecked(mCheckedItems.contains(tag)); 
         // set OnClickListener to handle checked switches 
         cb.setOnClickListener(new OnClickListener() { 
    
          public void onClick(View v) { 
           final CheckBox cb = (CheckBox) v; 
           final Pair<Long, Long> tag = (Pair<Long, Long>) v.getTag(); 
           if (cb.isChecked()) { 
            mCheckedItems.add(tag); 
           } else { 
            mCheckedItems.remove(tag); 
           } 
          } 
         }); 
    
         ... 
    
        } 
        ... 
    } 
    
  2. Dodaj getter dla sprawdzonej stanu

    public class ExpandableListAdapter extends BaseExpandableListAdapter { 
        ... 
        public Set<Pair<Long, Long>> getCheckedItems() { 
         return mCheckedItems; 
        } 
        ... 
    } 
    

Słabo wypełniona Zestaw zawiera wszystkie sprawdzone grupy/przedmioty podrzędne. Możesz wywołać metodę np. w twojej działalności.

Odnośnie drugiego pytania: zakładam, że podczas zwijania/rozwijania grupy sprawdzane dziecko jest niepoprawne z powodu niektórych wewnętrznych ponownych wyświetleń podrzędnych teraz na innej pozycji.

Należy również pamiętać o następujących atrybutach układu w polu wyboru, aby nie utracić zdarzeń kliknięcia elementu potomnego.

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

Thnx za pomoc w jego pracy .......... zmarnowałem 1 dzień na to zadanie ........ – Sunil