2016-06-28 2 views
0

私はcheckboximageViewtextViewでカスタムGridViewコントロールを持っています。 gridViewAdapter.getView()では、私は行とホルダーを使用して、チェックボックス、imageView、textviewの値を初期化しています。私は、チェックボックスをクリックしたときチェックボックス項目がチェックされているときにGridViewの位置を取得する方法は?

は今、私はそれがGridViewの内の別の位置に位置だから画像を移動することができますので、そのGridViewの項目の位置を取得する必要があります。

私はこのように試してみました:

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

更新日:getViewメソッド関数作品のOKパラメータ "位置"。 public View getView(int position、View convertView、ViewGroup parent){}。 しかし、最初のビューでチェックボックスを選択すると、チェックボックスの位置が正しく返されます。 しかし、次のビューまでスクロールすると、チェックボックスの位置はランダムになります。これを解決するには?

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

の一部は、アダプタからそれを取得する権利ビューを膨張させた後であれば(convertView == null)を閉じて、それ以外を削除する必要があります – silverFoxA

+0

ok getView関数のパラメータ "position"が機能します。 public View getView(int位置、View convertView、ViewGroup親){}。しかし、最初のビューでチェックボックスを選択すると、チェックボックスの位置が正しく返されます。しかし、次のビューまでスクロールすると、チェックボックスの位置はランダムになります。これを解決するには? – Jana

+0

これは自動ではありません。ユーザーがチェックボックスをオンにしたときにのみ、他の項目をチェックします。 – Jana

答えて

0

解決策はかなり簡単です。ここで私のアプリケーションの1つで実装したコードです。あなたはそれで行われたら

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

あなたはアダプタクラス完了あなたのActivityクラスの呼び出し

variable = adapter.item(); 

から今

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

からこののfuctionを使用してリストにアクセスすることができます!

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

そして、あなたがして位置してやりたい:

0

非常に簡単な解決策はviewtagを設定し、それがクリックされたときにそれを取得するには、以下のようなものにすることでしょう。実装に問題がある場合は、教えてください。

関連する問題