3

나는 수많은 아이콘이있는 GridView을 가지고 있는데 하나를 선택해야합니다. 그리고 선택에 의해 내 말은 : Android에서 클릭 한 GridView 항목에 배경 drawable을 설정하는 방법은 무엇입니까?

  • 나는 데이터베이스에 저장하는 드로어 블 ID가 필요 나는 사용자가 알 수 있도록 그리드에 시각적으로 어떤 종류의 그릴 필요
  • 을 (그래서 나중에 액세스 할 수 있습니다) 어떤 아이콘은 현재

내가 이걸 발견 선택 : http://groups.google.com/group/android-developers/browse_thread/thread/f08a58167dbaa8c8


그래서 나는 setSelection이 사진에서 내가이 아이콘 자체를 선택하거나 시각적 큐를 그릴을 사용할 수 없습니다 같아요. 나는 onItemClickListener에 그리드 항목 위치를 알고 그것을 개인 클래스 변수로 저장할 수 있습니다. 가장 큰 문제는 시각적 단서를 그려내는 것입니다.

어떻게하면됩니까? 클릭 한 항목에 시각적 큐를 그리고 사용자가 다른 항목을 클릭하면 해당 큐를 "undraw"하고 새 항목에 다시 그릴 수 있습니까?

+0

이것에 대한 답. 나는 당신이 어떤 종류의 선택 큐를 원한다면, 당신은 focusable 오브젝트가 필요하다고 믿습니다. 그러나 포커스가있는 개체를 사용하면 OnItemClickListener를 GridView에 첨부해도 작동하지 않습니다. 오히려 어댑터의 getView()에서 각 항목에 OnClickListener를 개별적으로 첨부해야합니다. – Ian

+0

각 항목에'OnClickListener'를 붙이는 것이 실제로 가능하지 않다고 생각합니까? 그것은 가능한 해결책 일 수 있습니다. 따라서 그것에 익숙하다면 아래에서 적절한 답을 할 수 있습니다. 나는 상관하지 않을 것이다. –

답변

4

몇 시간 동안이 문제를 해결 한 후 마침내 내가 찾던 해결책을 발견했다고 생각합니다. 대답은 거의 관련이 없지만 이안 솔루션의 초기 편집을 통해이 솔루션을 찾을 수있었습니다 :)

나는 내가 한 모든 것을 설명하지 않을 것입니다. 불과 몇 발언 :

  • 먼저 나는 view.Invalidate()view.postInvalidate() 대신 iconAdapter.notifyDataSetChanged()을 시도했지만 어느 쪽도했다. 문서에서는 무효화 메소드가 "가능한 경우"뷰를 다시 그리도록 "요청했습니다"라고 명시했습니다.

  • 두 개의 드로어 블을 병합하는 것보다 간단한 솔루션을 찾고있었습니다.예를 들어 ImageView 배경에 아이콘을 그리고 시각적 신호를 이미지로 그립니다. 이상한 이유로, GridView이 스크롤되었을 때 시각적 큐가 다른 아이콘 전체에 무작위로 표시되기 시작했습니다. 나는 이유를 이해하지 못한다. 그러나 배경 이미지 상단의 시각적 신호에 대한 생각은 나에게 완벽하다. ImageView은 그 여분의 병합 방법을 필요로하지 않는다. 그러나, 나는

MyActivity.java ... 그것없이 작동 할 수없는

public class MyActivity extends Activity { 
    private GridView mGridViewIcon; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mGridViewIcon = (GridView)findViewById(R.id.gridview_icon); 
     mGridViewIcon.setAdapter(new IconAdapter(this)); 

     mGridViewIcon.setOnItemClickListener(new GridView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       IconAdapter iconAdapter = (IconAdapter)parent.getAdapter(); 

       iconAdapter.setSelectedItemPosition(position); 
       iconAdapter.notifyDataSetChanged(); 
      } 

     }); 
    } 

} 

IconAdapter.java

public class IconAdapter extends BaseAdapter { 

    private int mSelectedPosition; 
    private Integer[] mThumbIds; 
    private int mIconSize; 
    private Context mContext; 

    public IconAdapter(Context context) { 
     mThumbIds = AppHelper.ICON_SET.keySet().iterator().next(); 
     mIconSize = context.getResources().getDimensionPixelSize(R.dimen.default_icon_size); 
     mContext = context; 
    } 

    @Override 
    public int getCount() { 
     return mThumbIds.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return mContext.getResources().getDrawable(mThumbIds[position]); 
    } 

    @Override 
    public long getItemId(int position) { 
     return mThumbIds[position]; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 

     if(convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize)); 
     } else { 
      imageView = (ImageView)convertView; 
     } 

     if(mSelectedPosition == position) { 
      imageView.setImageDrawable(mergeDrawableLayers(mThumbIds[position], 
        R.drawable.ic_note_selected_mark)); 
     } else { 
      imageView.setImageResource(mThumbIds[position]); 
     } 

     return imageView; 
    } 

    public void setSelectedItemPosition(int position) { 
     mSelectedPosition = position; 
    } 

    private Drawable mergeDrawableLayers(int background, int overlay) { 
     Drawable[] drawableLayers = new Drawable[2]; 

     drawableLayers[0] = mContext.getResources().getDrawable(background); 
     drawableLayers[1] = mContext.getResources().getDrawable(overlay); 

     return new LayerDrawable(drawableLayers); 
    } 

} 
내가보고 싶습니다
1

선택 큐를 원한다면 초점을 맞출 개체가 필요하다고 생각합니다. 그러나 포커스가있는 개체 (예 : Button)를 사용하면 GridView에 OnItemClickListener를 연결해도 작동하지 않습니다 (올바르게 기억하는 경우). 오히려 어댑터의 getView()에서 각 항목에 OnClickListener를 개별적으로 첨부해야합니다.

어댑터 :

활동 측면에서
// create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button button; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      button = new Button(mContext); 
      // set layout params (make sure its GridView.layoutParams) 
      // and other stuff 

     } 
     else { 
      button = (Button) convertView; 
     } 

     button.setBackgroundResource(mThumbIds[position]); // mThumbIds hold Resource Ids 
     button.setOnClickListener(new OnClickListener() { 
      onClick(View v) { 
      // store directly to database here, or send it with the activity with sharedPreferences (below) 

      // We need an Editor object to make preference changes. 
      // All objects are from android.context.Context 
      SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putInt("button_id", mThumbIds[position]); 

      // Commit the edits! 
      editor.commit(); 
      } 
     }); 
     return button; 
    } 
} 

, 저장 버튼 OnClickListener를하십시오 버튼 포커스입니다,하지만 난이 어떻게해야한다고 생각하기 때문에이 누락 사항이있을 수 있습니다

onClick(View v) { 
// Restore preferences 
     SharedPreferences settings = getSharedPreferences("MY_PREFERENCE", 0); 
     int id = settings.getInt("button_id", -1); 

     // now safe all stuff to database 
} 

. 또한 .xml 정의 된 선택 자 리소스를 사용하여 선택을 수행합니다. 그러나 그것은 별도의 질문으로 다루어 져야한다.

편집 1 : 사실 이제는 내가 생각하기에 드로어 블 .xml (선택기)에 ID가있을 수 있는지 확실하지 않습니다. 나는 나중에 집에서 이것을 구현해야하고 그것을 시도해야 할 것이다.

편집 2 : sharedPreference의 추가 활동 측면 질의 : 나는 부분

편집 3 sharedPreference을 추가했습니다.

+0

작동하는지 또는 예기치 않은 동작이 발생하는지 알려주십시오. – Ian

+0

나는 당신이 의미하는 바를 알고, 나는 단지 한가지에 대해 확신하지 못합니다. GridView는 내 활동의 한 요소 일 뿐이며, EditText 위젯과 같은 다른 것들도 있습니다. 그런 다음 GridView 항목의 ID를 포함하여 모든 데이터를 데이터베이스에 저장하는 버튼이 있습니다. 어떻게 처리해야할지 모르겠습니다. –

+0

"저장"버튼으로 만 정보를 저장하고 싶습니까? 이것은 질문의 범위를 넘어서는 대답을 만들 것입니다. 아마도 sharedPreference를 사용하여 항목 ID를 저장 한 다음 활동의 환경 설정을 쿼리 할 수 ​​있습니다. – Ian

관련 문제