2016-06-28 5 views
0

Ich habe eine benutzerdefinierte GridView mit checkbox, imageView und textView. In der gridViewAdapter.getView() habe ich Zeilen und Halter verwendet, um die Werte für Kontrollkästchen, ImageView und Textview zu initialisieren.Wie erhält man die GridView-Position, während das Kontrollkästchen aktiviert ist?

Wenn ich jetzt auf checkbox klicke, muss ich die Position dieses gridView-Elements abrufen, damit ich das Bild von seiner Position zu einer anderen Position in einer gridView verschieben kann.

ich so versucht:

public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ViewHolder holder = null; 
    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.imageTitle = (TextView) row.findViewById(R.id.textView); 
     holder.image = (ImageView) row.findViewById(R.id.imageView); 
     holder.cb=(CheckBox)row.findViewById(R.id.checkBox); 

      holder.cb.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //here with this checkbox which just got clicked, 
        // i want to access its gridview position or holder index 
        // so i can get access to the image 

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

    ImageItem item = (ImageItem)dataArraylist.get(position); 
    holder.imageTitle.setText(item.getTitle()); 
    holder.image.setImageBitmap(item.getImage()); 
    // holder.cb.setChecked(item.isSelected()); 

    return row; 
} 
    public static class ViewHolder { 
    public TextView imageTitle; 
    public ImageView image; 
    public CheckBox cb; 
} 

AKTUALISIERT: ok den Parameter "Position" von getView Funktion arbeitet. public Anzeigen von getView (int-Position, View convertView, ViewGroup-Parent) {}. Aber jetzt, wenn ich Kontrollkästchen in der ersten Ansicht auswählen, wird die Position des Kontrollkästchens korrekt zurückgegeben. Wenn ich jedoch zur nächsten Ansicht blättern gehe, ist die Position der Checkbox zufällig. Wie löst man das?

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

    final int pos=position; 
    ViewHolder holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.image = (ImageView) convertView.findViewById(R.id.imageView); 
     holder.cb=(CheckBox)convertView.findViewById(R.id.checkBox); 

     if(flag) { 
      holder.cb.setVisibility(View.VISIBLE); 
      holder.cb.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d("MYLOG", "position: "+pos); 
        ImageItem tempObj; 
        ImageItem item = clickedArraylist.get(pos); 
        if(item.isSelected()) 
         item.setSelected(false); 
        else 
         item.setSelected(true); 

         notifyDataSetChanged(); 

       } 
      }); 
     } 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
     holder.cb.setOnCheckedChangeListener(null); 
    } 
     ImageItem item = clickedArraylist.get(position); 
     holder.image.setImageBitmap(item.getImage()); 
     holder.cb.setChecked(item.isSelected()); 

    return convertView; 
} 


    public static class ViewHolder { 
    public ImageView image; 
    public CheckBox cb; 
} 
+0

Holen Sie es vom Adapter entfernen – silverFoxA

+0

ok der Parameter "position" der getView Funktion funktioniert. public Zeigen Sie getView an (int-Position, View convertView, ViewGroup-Parent) {}. Aber jetzt, wenn ich das Kontrollkästchen in der ersten Ansicht ankreuze, wird die Position des Kontrollkästchens korrekt zurückgegeben. aber wenn ich zur nächsten Ansicht scrolle, sind die Positionen der Checkbox zufällig. Wie löst man das? – Jana

+0

Es ist nicht automatisch .. nur wenn der Benutzer das Kontrollkästchen aktiviert hat, wird es ein anderes Element überprüfen bcoz die Position ist jetzt zufällig – Jana

Antwort

0

Die Lösung ist ziemlich einfach. Hier ist mein Code, den ich in einer meiner Apps implementiert habe.

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (dataTaken.contains(position)) { 
       checkBox.setChecked(false); 
       // checkBox.setClickable(false); 
       final Snackbar snackbar = Snackbar.make(coordinatorLayout, "Another topic already being taken", Snackbar.LENGTH_SHORT); 
       snackbar.setAction("Ok", new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         snackbar.dismiss(); 
        } 
       }) 
         .show(); 
      } else { 
       if (isChecked) { 
        number.add(position); 
       } else if (!isChecked) { 
        for (int m = 0; m < number.size(); m++) { 
         if (number.get(m).equals(position)) { 
          number.remove(m); 
         } 
        } 
       } 
      } 
     } 
    }); 

Sobald Sie damit fertig sind, können Sie die Liste mit diesen Funktionen erzeugt aus der Klasse Adapter zugreifen

public ArrayList<Integer> item() { 
    return number; 
} 

Jetzt von Ihrem Aktivitätsklasse Anruf

variable = adapter.item(); 

Fertig !!

0

Eine sehr einfache Lösung wäre, eine tag zum view zu setzen und es bekommen, wenn es angeklickt wird, so etwas wie unten:

holder.cb.setTag(pos); 
holder.cb.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int position = (int) v.getTag(); 

       ImageItem tempObj; 
       ImageItem item = clickedArraylist.get(position); 
       ... 
     }); 

und tun, was Sie mit der Position wollen dann. Bitte lassen Sie mich wissen, wenn Sie Schwierigkeiten haben, es zu implementieren.