2012-04-05 4 views
3

응용 프로그램의 홈 화면에서 안드로이드 메뉴와 비슷한 메뉴를 표시하는 방법은 있지만 특정 셀에는 항목을 표시 할 필요가 없습니다. 3x3의 그리드를 고려하면 (Row, Col) : [0,1], [1,0], [1,1], [1,2], [2,1]에 5 개의 항목 만 표시하면됩니다. .그리드보기에서 빈 항목 표시

표시 할 필요가없는 항목에 대해 GridView를 사용하여 표시 여부를 GONE (convertView.setVisibility (View.GONE);)으로 설정했습니다. 다음 항목은 그리드에 표시되지 않지만 사용자가 위/아래 키를 사용하여 빈 항목을 탐색하거나 빈 항목을 직접 클릭하면 해당 아이콘이 hihglighted되고 그리드의 빈 항목 인 것처럼 선택됩니다. 비어있는 상태에서 선택되지 않은 강조 표시되지 않은 사용자 이벤트를 회신해서는 안됩니다.

코드 그리드보기 :

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

} 

GridLayout과 : 그리드

<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에 대한 코드를 게시 할 수 있습니까? –

+0

에 필수 코드가 추가되었습니다. – Stauz

답변

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

+0

또한 항목을 사용하지 않도록 설정하면 사용자가 여전히 목록에서 항목을 선택할 수 있으며 이로 인해 항목의 강조 표시가 나타납니다 – Stauz

+0

알겠습니다. : P –

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

작동하지 않으면 전체 UI가 한 행에 표시되어 더 이상 눈금이 표시되지 않고 표시되지 않은 항목이 강조 표시됩니다. – Stauz

+0

코드를 편집 해보십시오. –

+0

이 방법이 유용 할 수 있습니다. P –