2015-06-25 12 views
16

Tôi đang sử dụng một GridView bên trong một ExpandableListViewĐang cố gắng để bỏ chọn một cái nhìn sử dụng getChildAt()

Tôi có một chức năng làm nổi bật một mục khi nó được nhấn vào, bây giờ tôi đang cố gắng để thực hiện một nút mà khi nhấn nó sẽ bỏ chọn tất cả các mục đã chọn, nhưng nó là unselecting chỉ quan điểm cuối cùng được nhấp

public class GridAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<Filhos> child; 
    public ArrayList<CadastraEscolas> escola; 
    private ArrayList<ArrayList<Filhos>> filhos = new ArrayList(); 



    public GridAdapter(Context context, ArrayList<CadastraEscolas> groups, ArrayList<Filhos> childValues, int groupPosition) { 
     mContext = context; 
     child = childValues; 
     escola = groups; 
     posicaoEscola = groupPosition; 


    } 


    @Override 
    public int getCount() { 
     return child.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 


     holder = null; 



     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.child_item, null); 
      holder = new ViewHolder(); 


      final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); 
      final TextView nomeAluno = (TextView) convertView.findViewById(R.id.name); 



      convertView.setTag(holder); 

      final View finalConvertView = convertView; 
      convertView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 





        if (list.size() > 0) { 

         isChecked = filhos.get(posicaoEscola).get(position).isChecked(); 


         if (!isChecked) { 

          selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); 


         } else { 

          selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); 

         } 



        ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(final View v) { 


          limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); 



         } 
        }); 


       } 
      }); 


     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.text.setText(child.get(position).getNome()); 


     return convertView; 


    } 


    static class ViewHolder { 
     TextView text; 
    } 



    public void selecao(boolean check, int position, TextView nomeAluno, int color, View v, int visibility) { 
    filhos.get(posicaoEscola).get(position).setChecked(check); 
    nomeAluno.setTextColor(color); 
    v.findViewById(R.id.overlay).setVisibility(visibility); 
    v.findViewById(R.id.overlayText).setVisibility(visibility); 
} 

public void limpaSelecao(boolean check, int position, TextView nomeAluno, int color, ViewGroup v, int visibility) { 



    for (int x = 0; x < group.size(); x++) { 

     for (int j = 0; j < group.get(x).getalunos().size(); j++) { 


      if(filhos.get(x).get(j).isChecked()){ 
       v.getChildAt(j).findViewById(R.id.loadingPanel).findViewById(R.id.overlay).setVisibility(View.GONE); 
      } 



      nomeAluno.setTextColor(color); 
     } 
    } 


} 

} 

Layout:

<RelativeLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:background="@drawable/nomealuno_main" 
       android:layout_below="@+id/child"> 

       <View 
        android:id="@+id/overlay" 
        android:layout_width="125dp" 
        android:layout_height="50dp" 
        android:background="@color/bgOverlay" 
        android:visibility="gone"/> 
</RelativeLayout> 

đây là những gì là happenin g:

khi tôi chọn tất cả các mục từ A đến B như thế:

enter image description here

Và nhấn rõ ràng, nó sẽ chỉ loại bỏ những đứa trẻ được chọn từ nhóm cuối cùng mà tôi nhấp:

enter image description here

Tôi cần phải xóa tất cả khi tôi nhấp vào Xóa, tất cả các trẻ em không có vấn đề gì trong nhóm chúng sẽ bị xóa.

ExpandableAdapter:

public class ExpandListTest extends BaseExpandableListAdapter { 


    public static final int CHOICE_MODE_MULTIPLE = AbsListView.CHOICE_MODE_MULTIPLE; 


    public static final int CHOICE_MODE_MULTIPLE_MODAL = AbsListView.CHOICE_MODE_MULTIPLE_MODAL; 

    /** 
    * No child could be selected 
    */ 
    public static final int CHOICE_MODE_NONE = AbsListView.CHOICE_MODE_NONE; 

    /** 
    * One single choice per group 
    */ 
    public static final int CHOICE_MODE_SINGLE_PER_GROUP = AbsListView.CHOICE_MODE_SINGLE; 

    /** 
    * One single choice for all the groups 
    */ 
    public static final int CHOICE_MODE_SINGLE_ABSOLUTE = 10001; 

    private Context context; 
    public static ArrayList<CadastraEscolas> groups; 
    private ArrayList<ArrayList<Filhos>> child = new ArrayList(); 
    private HashMap<String, GPSEscolas> aMap = new HashMap<String, GPSEscolas>(); 
    private HashMap<String, GPSEscolas> HashTask = new HashMap<String, GPSEscolas>(); 
    public static ArrayList<Filhos> listchild; 
    private GridAdapter adapter; 
    private SecurePreferences Sessao; 
    public static CustomGridView gridView; 
    private SparseArray<SparseBooleanArray> checkedPositions; 
    private static final String LOG_TAG = ExpandListAdapter.class.getSimpleName(); 


    public ExpandListTest(Context context, ArrayList<CadastraEscolas> groups, HashMap<String, GPSEscolas> data, SecurePreferences mSessao, HashMap<String, GPSEscolas> hashTask) { 
     this.context = context; 
     this.groups = groups; 
     this.aMap = data; 
     this.Sessao = mSessao; 
     checkedPositions = new SparseArray<SparseBooleanArray>(); 
     child = new ArrayList(); 
     if (groups != null) { 
      for (int i = 0; i < groups.size(); i++) { 
       child.add(i, groups.get(i).getalunos()); 
      } 
     } 
    } 


    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return child.get(childPosition); 
    } 

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

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


     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.gridview, null); 
     } 


     listchild = new ArrayList<Filhos>(); 

     for (int j = 0; j < groups.get(groupPosition).getalunos().size(); j++) { 

      listchild.add(child.get(groupPosition).get(j)); 

     } 


     gridView = (CustomGridView) convertView.findViewById(R.id.GridView_toolbar); 

     gridView.setExpanded(true); 
     adapter = new GridAdapter(context, groups, listchild, child, groupPosition, aMap, HashTask, Sessao); 
     gridView.setAdapter(adapter);// Adapter 
     gridView.setChoiceMode(CustomGridView.CHOICE_MODE_MULTIPLE); 



     return convertView; 

    } 


    @Override 
    public int getChildrenCount(int nGroup) { 
     return 1; 

    } 


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

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

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     CadastraEscolas group = (CadastraEscolas) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater inf = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = inf.inflate(R.layout.group_item, null); 
     } 
     ExpandableListView mExpandableListView = (ExpandableListView) parent; 
     mExpandableListView.expandGroup(groupPosition); 
     TextView tv = (TextView) convertView.findViewById(R.id.group_name); 
     tv.setText(group.getNome_fantasia()); 

     return convertView; 
    } 

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

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

} 
+0

đọc Xem tài liệu của nhóm – pskink

+0

@pskink tất cả các quyền tôi đã đọc, bây giờ bạn có thể giúp tôi không? – AND4011002849

+0

bạn có muốn xóa chế độ xem khỏi bố cục đó hay không? – Karoly

Trả lời

6

ViewGroups Android có thể chứa bất kỳ số lần xem, nhưng xem chỉ có thể có một phụ huynh ViewGroup, nếu bạn cố gắng thêm một Xem rằng đã có một phụ huynh, bạn sẽ nhận được ngoại lệ này (từ ViewGroup.addViewInner()):

throw new IllegalStateException("The specified child already has a parent. " + 
       "You must call removeView() on the child's parent first."); 

Điều này có nghĩa rằng cấu trúc của bố cục là của một cây (không phải là một đồ thị), và do đó bạn có thể sử dụng bất kỳ thuật toán cây traversal để lặp qua từng Xem của bạn bố trí.

Sau đây là một trong các thuật toán có thể có, đây là một quá trình truyền tải theo thứ tự sau.

enter image description here

Nó đi qua phần tử gốc, mất đứa con đầu lòng và thực hiện cuộc gọi đệ quy cho các thuật toán, thì đó là thứ hai, thứ ba vv ... khi không có trẻ em còn lại để đi qua, nó gọi chức năng bỏ chọn của bạn cho nút.

Đối với cây trong biểu đồ, các nút sẽ được hủy chọn theo thứ tự này:

A, C, E, D, B, H, I, G, F

public void onClickTheButton(View view) { 
    unselectall(R.layout.your_layout); 
} 

public void unselectAll(View view) { 
    if(view instanceof ViewGroup) { 
     for(int ii = 0 ; ii<(ViewGroup)view.getChildrenCount(); ii++) { 
      unselectAll((ViewGroup)view.getChildAt(ii)); 
     } 
    } 
    unselect(view); 
} 

Bạn có thể tìm thấy nhiều cách khác để làm điều đó tại đây: https://en.wikipedia.org/wiki/Tree_traversal

Bạn phải học cách các thuật toán đó hoạt động như thế nào nếu bạn muốn giảm bớt trải nghiệm lập trình của mình.

+0

Tôi đã chỉnh sửa câu hỏi, vì tôi có một ExpandableListView với 2 nhóm bên trong, vì vậy tôi có 2 Nhóm xem, làm cách nào để có được tất cả các con một lần? – AND4011002849

+0

giải thích cho tôi cách thức hoạt động này, vì vậy tôi có thể chấp nhận câu trả lời của bạn là đúng – AND4011002849

+0

Có OK không? –

1

thay đổi phương thức getView() của bạn như sau.

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.child_item, null); 
     holder = new ViewHolder(); 

     final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.text.setText(child.get(position).getNome()); 

    final View finalConvertView = convertView; 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if (list.size() > 0) { 
       isChecked = filhos.get(posicaoEscola).get(position).isChecked(); 

       if (!isChecked) { 
        selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); 
       } else { 
        selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); 
       } 

       ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(final View v) { 

         limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); 
        } 
       }); 
      } 
     }); 

     return convertView; 
    } 
+0

kiểm tra điều này và cho tôi biết nó hoạt động hay không? –

+0

Không, nhận được kết quả tương tự, chỉ nhóm cuối cùng được nhấp là bỏ chọn – AND4011002849

+0

Bạn có chắc chắn đang chuyển tham chiếu đến chế độ xem có chứa cả hai phần không? Nó luôn luôn là một trong những fête unelected, hoặc là nó có chứa các học sinh bạn đang bấm? –

Các vấn đề liên quan