2017-04-01 62 views
0

對於通過Android進行編碼並不瞭解Java的新手來說。我一直在通過發佈的其他問題放在一起,但我很掙扎。 我在我的OnCreate方法的頂部創建了一個名爲'images2'的數組,並將一堆顏色從我的drawable中逐一放入。這部分工作很好,但我一直在試圖創建一個onClickListner,它有一個OnClick方法,當你點擊它到另一種顏色時,它會改變drawable。我希望他們都變成相同的顏色。我知道我可以通過編程設置選擇器:gridview2.setSelector(new ColorDrawable(Color.BLACK));但是改變選擇器,無論是在後端還是XMl代碼都無法幫助我獲得新的可繪製對象。所以我在適配器中創建了另一個listArray,我可以在main中調用它。我在onClick中有一個索引,它會遍歷所有25個可能的項目位置,並且我想使它能夠將drawable更改爲數組中的每個位置。它還將當前位置添加到數組myarray.add(position);但我意識到價值可能不會被保存。 arrayList被聲明爲public,但它在適配器中聲明爲public,因此OnCreate中的更改沒有任何影響?對不起。這絕對是一個noobinoob-noob問題。允許用戶在GridView中選擇多個項目

/** 
 
* Created by Jordan on 3/25/2017. 
 
*/ 
 

 
public class Welcome extends AppCompatActivity implements AdapterView.OnItemClickListener { 
 

 
    public void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.welcome); 
 

 
     final List<Integer> images2 = new ArrayList<Integer>(); 
 
     images2.add(R.drawable.grid1);images2.add(R.drawable.grid6); 
 
     images2.add(R.drawable.grid2);images2.add(R.drawable.grid2); 
 
     images2.add(R.drawable.grid3);images2.add(R.drawable.grid1); 
 
     images2.add(R.drawable.grid4);images2.add(R.drawable.grid3); 
 
     images2.add(R.drawable.grid5);images2.add(R.drawable.grid2); 
 
     images2.add(R.drawable.grid6);images2.add(R.drawable.grid6); 
 
     images2.add(R.drawable.open);images2.add(R.drawable.grid4); 
 
     images2.add(R.drawable.grid1);images2.add(R.drawable.grid1); 
 
     images2.add(R.drawable.grid6);images2.add(R.drawable.grid4); 
 
     images2.add(R.drawable.grid4);images2.add(R.drawable.grid2); 
 
     images2.add(R.drawable.grid3);images2.add(R.drawable.grid3); 
 
     images2.add(R.drawable.grid6);images2.add(R.drawable.grid1); 
 
     images2.add(R.drawable.grid5); 
 

 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
 
     final GridView gridview2 = (GridView) findViewById(R.id.welcomeGrid); 
 

 
     final Welcome.ImageAdapter mAdapter = new Welcome.ImageAdapter(this, images2); 
 
     gridview2.setAdapter(mAdapter); 
 
     gridview2.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE); 
 
     gridview2.setItemChecked(2, true); 
 
     gridview2.setOnItemClickListener(this); 
 

 
     gridview2.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
 
       // ArrayList<Integer> clickedStatus = new ArrayList<Integer>(); 
 

 
       ArrayList<Integer> clickedStatus = new ArrayList<>(25); 
 
       clickedStatus.add(position); 
 
       if (position == 12){ 
 
        setContentView(R.layout.login); 
 
       } 
 
       else if(position != 12) { 
 
        // no matter, whether the item has already been clicked or not I want this toast to pop up to promp the user to actually enter the app and sign in 
 
        Toast.makeText(Welcome.this, "You selected " + position+ ".. Please select middle tile to enter!", 
 
          Toast.LENGTH_SHORT).show(); 
 

 
        if(clickedStatus.contains(position)){ 
 
         // as soon as it's noticed that the an integer matching the current position is currently stored in the 
 
         // array list (clickedStatus), I want it removed right below 
 
         // was passing item in place of position into the remove(). Don't know why Integer item = (Integer) parent.getItemAtPosition(position); 
 

 
         //I want to go through 25 numbers and 
 
         for(int i=0; i<25;i++){ 
 
           // compare those ints to what is in contained in the clickedstatus 
 
          if(clickedStatus.contains(i)){ 
 
           // Drawable Marker = getResources().getDrawable(R.drawable.celeb1); 
 
           images2.set(i, R.drawable.celeb1); 
 
           //for every int that is stored in click status I want 
 
           // to call the item and change the background of that item to a specified drawable file. 
 

 
          } 
 
         } 
 
        } 
 
        else { 
 
         clickedStatus.add(position); 
 
        // images2.set(position,); 
 
         for(int i=1; i<25;i++){ 
 
          // compare those ints to what is in contained in the clickedstatus 
 
          if(clickedStatus.contains(i)){ 
 
           // Drawable Marker = getResources().getDrawable(R.drawable.celeb1); 
 
           images2.set(i, R.drawable.celeb1); 
 
           //for every int that is stored in click status I want 
 
           // to call the item and change the background of that item to a specified drawable file. 
 

 
          } 
 
         } 
 

 
        } 
 
        // gridview2.setSelector(new ColorDrawable(Color.BLACK)); 
 
        // mAdapter.notifyDataSetChanged(); 
 
       } 
 
      } 
 
     } 
 
     ); 
 
    } 
 
// I think this got generated automatically at some point somehow. Might of been with the multichoicemode line above^
 
    @Override 
 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
 

 
    } 
 

 
    public class ImageAdapter extends BaseAdapter { 
 
     private Context mContext; 
 
     //IMAGES ARE REFERENCED HERE V--- 
 
     private List<Integer> mImages2; 
 
     public ArrayList<Integer> clickedStatus = new ArrayList<Integer>(); 
 
     //create array to store whether an item has been clicked or not. needs to be public!! 
 

 
     //check to determine the case in the below method 
 

 
     // IGNORE THIS 
 
     // private int selectedPosition = -1; 
 
     //public void setSelectedPosition(int position) { 
 
     // selectedPosition = position; 
 
     //} 
 

 
      public ImageAdapter(final Context c, final List<Integer> images2){ 
 
      mContext = c; 
 
      mImages2 = images2; 
 

 

 
     } 
 

 
     public int getCount() { 
 
      return mImages2.size(); 
 
     } 
 

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

 
     public long getItemId(int position) { 
 
      return 1; 
 
     } 
 
     // create a new ImageView for each item referenced by the Adapter 
 
     public View getView(int position, View convertView, ViewGroup parent) { 
 
      ImageView imageView; 
 
      if (convertView == null) { 
 
       // if it's not recycled, initialize some attributes 
 
       imageView = new ImageView(mContext); 
 
       imageView.setLayoutParams(new GridView.LayoutParams(140, 120)); 
 
       imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
 
       imageView.setPadding(0, 0, 0, 0); 
 
      } else { 
 
       imageView = (ImageView) convertView; 
 
      } 
 
      if(clickedStatus.contains(position)){ 
 
       convertView.setSelected(true); 
 
       convertView.setPressed(true); 
 
       convertView.setBackgroundColor(Color.GREEN); 
 
      } 
 

 
      imageView.setImageResource(mImages2.get(position)); 
 
      return imageView; 
 
     } 
 
     ;} 
 
}

+0

對不起。我知道我在那裏的代碼有一個絕對的混亂,但我是一個多任務試圖一次做幾件事情。我曾經有過15+個標籤可以一次睜開眼睛,讓我的臉看起來更容易。請儘管幫忙。這是我的MSIS學士學位項目的最後一個項目,我的團隊基本上已經把所有的事情從頭到腳留給了我! –

+0

我真的很想盡量保持儘可能多的機會(披露那些什麼都不做的事情),但是如果我因爲強烈的直接回答而需要進行徹底改革,我也會因此而失望。我現在還在研究它,所以不要以爲我只是把它放在神的詭計中!我工作了很多,但我會休息幾天,這可能真的有助於本週。 –

回答

0

我創建並最終確定一組不同的陣列爲選擇,將導致一個雙贏的每一個可能的五種組合持有。標題對角線(1,2,3,4,5),水平(1,2,3,4,5),垂直(1,2,3,4,5)等。點擊一個值被存儲在ListArray的適當位置和我有相對檢查(如果語句),每次點擊按鈕時都會循環。不會顯着減慢應用程序的運行速度,在紙上看起來很醜,但功能非常強大,無需使用複選框。如果有人有興趣看到他們可能評論的代碼。

相關問題