2016-06-28 119 views
0

我有一個自定義的GridView與checkbox,imageViewtextView。 在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; 
} 

更新:OK參數 「位置」 的getView功能工作。 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

從適配器獲取它 – silverFoxA

+0

確定getView函數的參數「position」工作正常。 public View getView(int position,View convertView,ViewGroup parent){}。但是現在,當我在第一個視圖中選擇複選框時,複選框的位置會正確返回。但是當我向下滾動到下一個視圖時,複選框的位置是隨機的。如何解決這個問題? – Jana

+0

它不是自動的..只有當用戶選中複選框時,它會檢查其他項目bcoz的位置是隨機的 – Jana

回答

0

該解決方案非常簡單。這是我在我的一個應用程序中實現的代碼。

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

一旦你做完這些後,你可以使用這個機能的研究從適配器類

public ArrayList<Integer> item() { 
    return number; 
} 
從Activity類的呼叫

variable = adapter.item(); 

完成

現在訪問列表!

0

一個非常簡單的解決辦法是設置一個tagview,並得到它被點擊時,類似下面:

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

,做任何你想要的位置即可。如果您在實施時遇到問題,請告訴我。

相關問題