2012-12-24 5 views
2

시나리오 : 각 탭마다 자체 목록보기가있는 n 개의 탭이 있습니다. 나는 배열 어댑터를 사용하여리스트 뷰를 생성하고있다. arrayadaper에 전달 된 배열은 객체의 배열을 가지고 있습니다. 각 개체에는 "메뉴"및 "메뉴 유형"이 있습니다. 이제 메뉴 유형에 따라 메뉴 유형이 "menugroup"인 경우 다른 레이아웃을 사용하여 그려야하며 배경을 빨간색으로 설정합니다.목록보기의 행을 무시하는 방법

질문은 간단합니다. 목록보기에서 menugroup 행을 클릭 할 때마다 아무 일도 일어나지 않아야합니다. 즉, menugroup 행에서 클릭을 무시하는 방법입니다. 이것은 onItemClick 메서드에서 메뉴 행에 발생한 클릭의 세부 사항 만 캡처해야합니다. 계속 진행할 수있는 아이디어 나 단서를 주시겠습니까? 미리 감사드립니다.

public class MyCustomAdapter extends ArrayAdapter<Menu> { 
private ArrayList<Menu> menuItemList; 
Context context; 
LayoutInflater vi; 

public MyCustomAdapter(Context context ,ArrayList<Menu> menu) {  
    super(context, 0, menu);  
    this.menuItemList = new ArrayList<Menu>();  
    this.menuItemList.addAll(menu); 
    this.context =context; 
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    }  

private class ViewHolder { 
    TextView menuItem; 
    TextView menuGroup; 
    } 

public int getItemViewType(int position) { 
    if (menuItemList.get(position).getMenuType().equals("menugroup")) 
     return 0; 
    return 1; 
} 
public int getViewTypeCount() { 
    return 2; 
} 
public View getView(final int position, View convertView, ViewGroup parent) {  
    ViewHolder holder; 
    int type = getItemViewType(position); 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     switch (type) { 
     case 0: 
      convertView = vi.inflate(R.layout.group, null); 
      holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup); 
      convertView.setBackgroundColor(Color.RED); 
      break;    
     case 1: 
      convertView = vi.inflate(R.layout.item, null); 
      holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
      break; 
     } 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    }  

    switch (type) { 
    case 0:   
     holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
     convertView.setBackgroundColor(Color.RED); 
     break;    
    case 1: 
     holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
     break; 
    } 

    return convertView; 
    } 
어댑터에

}

답변

2

재정 isEnabled()와 상호 작용하는 것으로 간주해서는 안 어떤 위치 (docs link)에 대한 false을 반환합니다. 기본적으로이 값은 모든 요소에 대해 true을 반환합니다.

+0

여기는 BaseAdapter입니다. ArrayAdapter를 사용하고 있습니다. ArrayAdapter에서 유용할까요? – user1822729

+0

'ArrayAdapter'는'BaseAdapter'의 서브 클래스입니다. 그들은 모두 같은 방식으로 작동합니다. – Devunwired

+0

정확히 당신의 도움에 감사드립니다. 그것은 작동합니까 – user1822729

0

청취자의 어댑터 getItemViewType()을 사용하십시오. 이 값이 0이면 리스너에서 더 이상 아무것도하지 마십시오.

listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
     if (parent.getAdapter().getItemViewType(position) == 0) 
      return; 

     // do something for non-menugroup clicks 
    } 
}); 
+0

어떤 샘플 코드를 가르쳐 주시겠습니까? – user1822729

+0

@ user1822729 예제를 추가했습니다. 그러나, isEnabled() 솔루션은 나에게 우월 해 보인다. – user113215

+0

당신의 아이디어는 효과가있다. 그러나 나는이 논리를 Adapter 클래스에 유지하고자하므로 isEnable()을 사용했다. – user1822729

관련 문제