2012-11-18 2 views
0

아이콘이있는 ListView가 있습니다. 모든 ListView 행에는 다른 아이콘이 있거나 아이콘이 없습니다.android listview 올바른 아이콘을 얻는 중

행이 올바른 아이콘을 얻을 수 있지만 문제가 있습니다. 아이콘이 없어야하는 행에는 아이콘이 있어야합니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.list_item, null); 

     TextView title = (TextView) vi.findViewById(R.id.name); 
     ImageView icon = (ImageView) vi.findViewById(R.id.icon); 

     HashMap<String, String> item = new HashMap<String, String>(); 
     item = data.get(position); 

     String imgPath = ASSETS_DIR + item.get(myTable.KEY_PIC) + ".png"; 

      try { 
       Bitmap bitmap = BitmapFactory.decodeStream(vi 
         .getResources().getAssets().open(imgPath)); 
       icon.setImageBitmap(bitmap); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     title.setText(item.get(myTable.KEY_NAME)); 

    return vi; 
} 

KEY_PIC는 항상 값을 가지고 있으며, KEY_PIC의 값이 일부 아이콘의 파일 이름과 동일한 경우에만 다음 아이콘을 표시해야합니다. 코드를 작성하는 방법을 알아낼 수 없습니다. 나는 if-else에서 뭔가를해야만한다.

+0

행에 아이콘이 설정되어 있지 않으면 행의 "KEY_PIC"에 값이 표시되는 이유는 무엇입니까? 어떤 가치가 있습니까? 올바른 경로이면 아이콘이 설정됩니다. '아이콘'ImageView를 보유하고있는 레이아웃 XML에 기본 소스가 설정되어 있지 않은지 확인 했습니까? – ottel142

+0

내 xml 레이아웃에 기본 소스가 없습니다. – windblow

+0

"KEY_PIC"는 내 프로젝트에서 같은 이름이지만 위치가 다른 다른 것들을 찾는 데 사용됩니다. 따라서 XML 리소스 파일 (데이터베이스)에 정보를 더 추가하지 않아도됩니다. – windblow

답변

0

첫 번째로 getview()에 HashMap<String, String> item = new HashMap<String, String>();을 넣어서 나쁜 결과를 보았습니다. 지금 당장 당신은 모든 행이 다시 보여지기 때문에 이것들 중 하나를 새로 만들고 있습니다. 그것은 불필요합니다. 솔직히 난 당신이 행이 표시되도록되어 있지 않은 경우 경로 아무것도로 연결되지 않음을 주장하는 경우 당신이 아이콘을 볼 수 있다는 것이 얼마나 이해할 수없는

String imgPath = ASSETS_DIR + data.get(position).get(myTable.KEY_PIC) + ".png"; 

을 : 그냥 삭제하고 사용 어떤 것. 작동이 잘된다면 설정시 발생할 수있는 예외 상황을 파악하고 아무 것도하지 않아도됩니다. 해당 위치에서 data의 실제 값을 조사하면 통찰력을 얻을 수 있습니다. 그것이 나라면, 그 자리에 null을 넣었을 것입니다.

임시 대안은 listview의 각 위치에 대해 부울 배열을 만든 다음 해당 위치의 값이 체크 아웃되면 아이콘 설정 만 수행하는 것입니다.

boolean[] varIcon = { 
      true, 
      false, 
      false, 
      true, 
      false, 
      true }; 
// ... 
// then in the getView() now; 


if (varIcon[position] == true) { 
       String imgPath = ASSETS_DIR + data.get(position).get(myTable.KEY_PIC) + ".png"; 
       try { 
         Bitmap bitmap = BitmapFactory.decodeStream(vi 
           .getResources().getAssets().open(imgPath)); 
         icon.setImageBitmap(bitmap); 

        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
      } 
0

가능성이 문제의 의견 재활용지고 당신은 결코 이전에 설정 한 이미지를 삭제하지하고 있다는 것입니다, 노력이 그것을 증명합니다 :

 String imgPath = ASSETS_DIR + item.get(myTable.KEY_PIC) + ".png"; 

     try { 
      Bitmap bitmap = BitmapFactory.decodeStream(vi 
        .getResources().getAssets().open(imgPath)); 
      icon.setImageBitmap(bitmap); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      icon.setImageDrawable(null); 
     } 

을하지만, 대한 예외 처리에 의존 완벽하게 유효한 결과는 좋은 습관이 아니며 성과에 우호적이지 않습니다. myTable.KEY_PIC 열을 null로 반환하고 다음을 수행 할 것을 권장합니다.

String imageName = item.get(myTable.KEYP_PIC); 
if (imageName == null) { 
    icon.setImageDrawable(null); 
} else { 
    //your code 
} 

어느 것이 훨씬 더 깨끗합니다.