2012-04-05 81 views
3

在應用程序的主屏幕上,如何顯示類似於android菜單的菜單,但不需要在特定單元格中顯示項目。考慮3×3的網格,只需要在(Row,Col):[0,1],[1,0],[1,1],[1,2],[2,1] 。在網格視圖中顯示空白項目

我們已經嘗試了GridView,併爲無需顯示的項目設置了GONE(convertView.setVisibility(View.GONE);)的可見性。在此之後,項目不會顯示在網格中,但是當用戶使用上下鍵瀏覽空白項目或直接單擊空白項目時,該圖標被高亮顯示並選擇,就好像它是網格中的空白項目一樣。我們希望它是空白的,它不應該響應用戶事件,既不突出顯示也不選擇。

代碼爲網格視圖:

package org.XXX; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class XXXActivity extends Activity { 
    GridView MyGrid; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.maingrid); 
     MyGrid = (GridView)findViewById(R.id.MyGrid); 
     MyGrid.setAdapter(new ImageAdapter(this)); 


     MyGrid.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
       Toast.makeText(arg0.getContext(), position + " selected", Toast.LENGTH_LONG).show(); 

       switch(position) { 
       case 0:break; 
       case 1: 
        //Browse 
        Intent newIntent = new Intent(XXXActivity.this, YYYListItemIcons.class); 
        startActivity(newIntent); 
        break; 
       case 2:break; 
       case 3: 
        //Saved Searches 
        newIntent = new Intent(XXXActivity.this, ZZZListItemIcons.class); 
        startActivity(newIntent); 
        break; 
       case 4: 
        //Sign in 
        break; 
       case 5: 
        //Reminders 
        break; 
       case 6:break; 
       case 7: 
        //Sign up 
        break; 
       case 8:break; 
       } 
      } 

     }); 

     //onSearchRequested(); //to open search by default 
    } 


    public class ImageAdapter extends BaseAdapter 
    { 
     Context MyContext; 

     public ImageAdapter(Context _MyContext) 
     { 
      MyContext = _MyContext; 
     } 

     @Override 
     public int getCount() 
     { 
      return 9; 
     } 

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

      ViewHolder holder; 
      LayoutInflater mInflater = LayoutInflater.from(MyContext); 

      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.grid_item, null); 
       holder = new ViewHolder(); 
       holder.text = (TextView) convertView.findViewById(R.id.grid_item_text); 
       holder.icon = (ImageView) convertView.findViewById(R.id.grid_item_image); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      // Bind the data efficiently with the holder. 
      holder.text.setText(getTextId(position)); 
      holder.icon.setImageBitmap(BitmapFactory.decodeResource(MyContext.getResources(), getIconId(position))); 
      if(getIconId(position) == R.drawable.nothing) { 
       convertView.setVisibility(View.GONE); 
      } 
      return convertView; 
     } 

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

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

     private int getIconId(int position) { 
      int iconImages[] = { 
        R.drawable.nothing, 
        R.drawable.browse, 
        R.drawable.nothing, 
        R.drawable.saved_searches, 
        R.drawable.sign_in, 
        R.drawable.reminders, 
        R.drawable.nothing, 
        R.drawable.sign_up, 
        R.drawable.nothing 
      }; 
      return iconImages[position]; 
     } 

     private int getTextId(int position) { 
      int iconNames[] = { 
        R.string.nothing, 
        R.string.browse, 
        R.string.nothing, 
        R.string.saved_searches, 
        R.string.sign_in, 
        R.string.reminders, 
        R.string.nothing, 
        R.string.sign_up, 
        R.string.nothing 
      }; 
      return iconNames[position]; 
     } 

    } 

    static class ViewHolder { 
     TextView text; 
     ImageView icon; 
    } 

} 

網格佈局:

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MyGrid" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:padding="5dp" 
    android:verticalSpacing="5dp" 
    android:horizontalSpacing="20dp" 
    android:numColumns="auto_fit" 
    android:columnWidth="60dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center"> 
</GridView>    

PerItemIconLayout網格:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/GridItem" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:gravity="center_horizontal"> 

    <ImageView android:id="@+id/grid_item_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </ImageView> 

    <TextView android:id="@+id/grid_item_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" 
     android:gravity="center_horizontal" 
     android:textColor="#FFFFFF"> 
    </TextView> 

</LinearLayout> 
+0

你可以請你的代碼爲gridview? – 2012-04-05 03:57:29

+0

添加了所需的代碼。 – Stauz 2012-04-05 04:07:49

回答

0

現在你已經貼出你的代碼,我不知道,如果你可以在技術上刪除,但您可以禁用您正在討論的「突出顯示」單擊,這樣,當用戶c舔上其中一個圖標,它將不再突出顯示。

這可以通過XML或在您的代碼來完成:

https://stackoverflow.com/questions/2865683/android-disable-highlighting-in-gridview 

Code: GridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 
XML: android:listSelector="#00000000" 

但是,這會影響你的GridView的所有圖標。

在此另外看一看:

https://stackoverflow.com/questions/5514629/how-to-disable-item-click-for-particular-positions-in-grid-view-in-android

+0

如果我們設置了列表選擇器,那麼即使所需的項目也不會被突出顯示。所以,這種方法無法遵循。 – Stauz 2012-04-05 05:13:26

+0

此外,禁用項目沒有影響用戶仍然可以選擇列表中的項目,這導致項目的高亮 – Stauz 2012-04-05 05:14:11

+0

好的,我明白了。 :P – 2012-04-05 06:14:10

0
if(getIconId(position) == R.drawable.nothing) { 
convertView.setVisibility(View.GONE); 
} 

由以下替換上面的行,並嘗試....

if(getIconId(position) == R.drawable.nothing) { 
    convertView.setVisibility(View.GONE); 
    convertView.setClickable(false); 
    convertView.setEnabled(false); 
} 

嘗試在getview這個代碼()。

+0

不工作,整個用戶界面顯示在一行上,因此不再有網格,並且未顯示的項目被突出顯示。 – Stauz 2012-04-05 05:55:03

+0

試試現在編輯代碼 – 2012-04-05 06:07:21

+0

讓我知道如果這個工程,這可能是非常有用的:P – 2012-04-05 06:20:50