2016-08-30 4 views
-1

눌렀을 때 gridview에서 항목을 강조 표시하려고합니다. StackOverflow에서 비슷한 질문을 보았습니다. 그러나 그 중 아무 것도 내 앱 (디자인 상상력 또는 최소 API로 인해)에 대해 가능한 방식으로 원하는 것을 수행 할 수 없습니다.gridview에서 항목 강조 표시

최소 API는 9이므로 Multi_choice_listener를 사용할 수 없습니다.

지금 당장 나는 원하는 색상으로 배경을 설정할 수 있지만, 한 요소를 누르면 화면의 동일한 위치에있는 다른 요소를 누르게됩니다 (gridview를 스크롤 한 후).

예를 들어,이 화면 상상 : 내가 B를 누른 후 나는 화면을 스크롤하면

ABC 을 DEF

가 표시됩니다 :

GHI JKL

그리고를 H는 강조 표시됩니다 (B와 동일한 위치에 있기 때문에).

다음
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    viewHolder = null; 
    if (convertView == null) { 

     viewHolder=new ViewHolder(); 

     LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view=layoutInflater.inflate(R.layout.highwayappselectionitem,parent, false); 

     viewHolder.appImageIcon=(ImageView) view.findViewById(R.id.highwayGridViewItemIcon); 
     viewHolder.appNameLabel=(TextView) view.findViewById(R.id.highwayGridViewItemName); 
     viewHolder.appInfoButton = (ImageView) view.findViewById(R.id.highwayGridViewItemInfoButton); 
     viewHolder.linearLayout = (LinearLayout) view.findViewById(R.id.HighwayGridViewItem); 

    }else{ 
     view= convertView; 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 


    viewHolder.appNameLabel.setText(appsList.get(position).getAppName()); 
    viewHolder.appImageIcon.setImageDrawable(appsList.get(position).getImageIcon()); 


    view.setTag(viewHolder); 

    viewHolder.linearLayout.setOnClickListener(new MyOnClickListener(position,0)); 

    return view; 
} 

이 (어댑터 내부) 리스너입니다 내가 배경을 설정합니다

여기 내의 getView 방법입니다. 기본적으로 내가 gridview에서 항목을 누르면, 그 항목이 특정 색상으로 배경을 변경하여 사람이 그것을 눌렀다는 것을 알 수 있기를 바랍니다.

public void onClick(View v) { 

     if(selectedView==0 || selectedView==1){ 

      appName=appsList.get(position).getAppName(); 
      filePath=appsList.get(position).getFilePath(); 
      appLogo=appsList.get(position).getImageIcon(); 

      v.setBackgroundColor(activity.getResources().getColor(R.color.light_grey));   

      System.out.println("Just pressed the app ... "+appName); 
      System.out.println("His filePath is ... "+filePath); 

      HighwayGridViewAppItem tmpSelectedItem= new HighwayGridViewAppItem(appLogo, appName, filePath); 
      selectedAppsList.add(tmpSelectedItem); 

      System.out.println("AppSelectionCUstomAdapter : Added a new application to the list of selected apps .!!!!!!!!!!!!!!!........."); 
      System.out.println("AppselectioncustomAdaptaer : The size of the selectedAppsList is now : "+selectedAppsList.size()); 

     }else{ 
      //pressed the info button 
      System.out.println("This will be implemented later, need access to the webservices"); 
     } 
    } 
} 

appslist가있는 gridview 내 사용자 정의 항목의 목록입니다

여기에 그 청취자 내 코드입니다.

업데이트 : 해결 방법은 선택한 대답을 적용하는 것입니다.

기본적으로 나는 뷰의 배경을 잘 설정하고 있었지만 재사용되고 있기 때문에 (뷰잉 홀더를 사용하고 있기 때문에), 그리고 뷰에는 이미 그 배경의 배경이 있었기 때문에 그것은 재사용 될 것이고, 배경색으로 재사용 될 것입니다. 해결책은 단순히 else 문을 작성하고 배경을 첫 번째 색상으로 되돌려 놓는 것입니다.

+0

내가 편집하지 않으려 고했기 때문에 그것을 재 게시했습니다. 또한이 방법은 대부분의 사람들이 보는 최신의 것으로 이동합니다. 그리고 지금은 밤에 이것을 게시하고 있기 때문에 "새로운 사람들"에 도달하게됩니다. 다시 말하지만, 내가 다른 질문을 삭제하거나 편집 할 수는 있겠지만, 나를 풀어주지는 못했습니다. –

+0

그러나 답변을 가지고 있기 때문에 삭제할 수 없으므로 차단 될 수 있습니다. –

+0

이 질문은 이제 해결되었습니다.Btw, 최근 질문에 태그를 붙인 두 번째 질문은 다른 질문입니다. 선택기와 함께 누를 때 강조 표시하고 다른 배경으로 두지 말아야한다는 것입니다. –

답변

1

선택한보기가 아닌 선택한 항목 위치를 저장해야합니다. 그래서 코드는 다음처럼 보일 것이다 :

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    /.../ 
    if (convertView == null) { 
     /.../ 
     //click listener now common to all views 
     viewHolder.linearLayout.setOnClickListener(this); 
    } else { 
     /.../ 
    } 

    //bind possition to viewholder 
    viewHolder.possition = possition; 
    viewHolder.setHighlighted(possition == selectedItem); 

    /.../ 
} 

public void onClick(View v) { 
     ViewHolder holder =(ViewHolder)v.getTag(); 
     selectedItem = holder.possition; 
     notifyDataSetChanged(); 
} 

당신이 선택한 위치를 유지하는 Set<Integer> 만들 수있는 여러 choises이 필요합니다. 좋아요 :

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    /..../ 
    viewHolder.setHighlighted(selectedItems.contains(position)); 
    /..../ 
} 

public void onClick(View v) { 
     ViewHolder holder =(ViewHolder)v.getTag(); 
     if (selectedItems.contains(holder.position)) { 
      selectedItems.remove(holder.position); 
     } else { 
      selectedItems.add(holder.position); 
     } 
     notifyDataSetChanged(); 
} 
+0

setHighlighted 메서드는 무엇이겠습니까? 나는 이미 존재합니까? 지금은 테스트 할 수 없지만 괜찮아 보입니다. –

+0

그것은 단지 의사 코드입니다. 나는이 기능이 부울을 기반으로 강조 표시되는지 아닌지 (배경 또는 기타 설정) 뷰를 설정한다는 것을 의미합니다. – j2ko

+0

이것은 좋은 해결책이 될 것이고, 나는 이것을 사용했다. 목록을 확인하거나 목록에 추가하는 대신 항목을 나타내는 사용자 정의 클래스에 속성을 만들었습니다. 근본적으로 무슨 일이 있었는지는 뷰의 배경을 잘 설정하고 있었지만 (뷰잉 홀더를 사용하고 있기 때문에) 뷰를 재사용하고 있기 때문에 뷰가 이미 그 색을 배경으로했기 때문에, 재사용하면 배경색으로 재사용됩니다. 해결책은 단순히 else 문을 작성하고 배경을 첫 번째 색상으로 되돌려 놓는 것입니다. –

1

gridview.setItemChecked (위치, 참);

+0

거기에 selectedListItem은 무엇입니까? –

+0

@ FilipeGonçalves 내가 고쳤습니다. – huk

+0

도움을 주셔서 감사합니다. 다른 솔루션을 사용하여 항목을 "확인"했습니다. 이는 구현에 따라 더 쉬울 것이기 때문입니다. 그러나 이것은 또한 그것을하는 또 다른 방법입니다. 내 솔루션을 알고 싶다면 내 질문에 쓴 업데이트를 확인하십시오. –

관련 문제