2012-03-28 2 views
2

모두ListView 디바이더 및 비 - 클릭 가능 아이템

리스트에 디바이더를 표시하고 그 아이템을 클릭 할 수 없게하고 회색으로 보이게하고 싶습니다. 나는 xml 레이아웃을 클릭 할 수 없도록 설정하려고 시도했으나 부 풀릴 때 활성화되지 않았지만 작동하지 않았다. 아래 코드는 내 코드입니다.

private static final String[] items = { "lorem", "ipsum", "dolor", "sit", 
    "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", 
    "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", 
    "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", 
    "augue", "purus","Afghanistan", "Albania", 
    "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", 
    "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", 
    "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain", 
    "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", 
    "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina", 
    "Botswana", "Bouvet Island", "Brazil", 
    "British Indian Ocean Territory", "British Virgin Islands", 
    "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cote d'Ivoire", 
    "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands", 
    "Central African Republic", "Chad", "Chile", "China", 
    "Christmas Island", "Cocos (Keeling) Islands", "Colombia", 
    "Comoros", "Congo", "Cook Islands", "Costa Rica", "Croatia", 
    "Cuba", "Cyprus", "Czech Republic", 
    "Democratic Republic of the Congo", "Denmark", "Djibouti", 
    "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt", 
    "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", 
    "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", 
    "Finland", "Former Yugoslav Republic of Macedonia", "France", 
    "French Guiana", "French Polynesia", "French Southern Territories", 
    "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", 
    "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", 
    "Guinea", "Guinea-Bissau", "Guyana", "Haiti", 
    "Heard Island and McDonald Islands", "Honduras", "Hong Kong", 
    "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq", 
    "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan", 
    "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos", 
    "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", 
    "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "Madagascar", 
    "Malawi", "Malaysia", "Maldives", "Mali", "Malta", 
    "Marshall Islands", "Martinique", "Mauritania", "Mauritius", 
    "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia", 
    "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia", 
    "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", 
    "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", 
    "Niue", "Norfolk Island", "North Korea", "Northern Marianas", 
    "Norway", "Oman", "Pakistan", "Palau", "Panama", 
    "Papua New Guinea", "Paraguay", "Peru", "Philippines", 
    "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar", 
    "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", 
    "Saint Helena", "Saint Kitts and Nevis", "Saint Lucia", 
    "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", 
    "Samoa", "San Marino", "Saudi Arabia", "Senegal", "Seychelles", 
    "Sierra Leone", "Singapore", "Slovakia", "Slovenia", 
    "Solomon Islands", "Somalia", "South Africa", 
    "South Georgia and the South Sandwich Islands", "South Korea", 
    "Spain", "Sri Lanka", "Sudan", "Suriname", 
    "Svalbard and Jan Mayen", "Swaziland", "Sweden", "Switzerland", 
    "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", 
    "The Bahamas", "The Gambia", "Togo", "Tokelau", "Tonga", 
    "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", 
    "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda", 
    "Ukraine", "United Arab Emirates", "United Kingdom", 
    "United States", "United States Minor Outlying Islands", "Uruguay", 
    "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", 
    "Wallis and Futuna", "Western Sahara", "Yemen", "Yugoslavia", 
    "Zambia", "Zimbabwe" }; 

    TextView selection; 
    ListView list; 
    MyCustomAdapter mAdapter; 




/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    selection = (TextView) findViewById(R.id.textView1); 
    list = (ListView) findViewById(R.id.listView1); 
    mAdapter = new MyCustomAdapter(); 


    for (int i = 0; i < items.length; i++) { 
     mAdapter.addItem(items[i]); 
     if ((i+1) % 4 == 0) { 
      mAdapter.addSeparatorItem("separator " + (i+1)); 
     } 
    } 



    list.setAdapter(mAdapter); 

    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 

      int type; 
      type = mAdapter.getItemViewType(arg2); 

      if (type == 0){ 
       selection.setText("item"); 
      } 

      if (type == 1){ 
       selection.setText("divider"); 
      } 


     } 
    }); 

} 

class MyCustomAdapter extends BaseAdapter{ 
    private static final int TYPE_ITEM =0; 
    private static final int TYPE_SEPARATOR = 1; 
    private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1; 

    private ArrayList<String> mData = new ArrayList<String>(); 
    private LayoutInflater mInflater; 

    private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>(); 

    public MyCustomAdapter() { 
     mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final String item) { 
     mData.add(item); 
     notifyDataSetChanged(); 
    } 

    public void addSeparatorItem(final String item) { 
     mData.add(item); 

     // save separator position 
     mSeparatorsSet.add(mData.size() - 1); 
     notifyDataSetChanged(); 
    } 


    @Override 
    public int getItemViewType(int position) { 
     return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return TYPE_MAX_COUNT; 
    } 

    @Override 
    public int getCount() { 

     return mData.size(); 
    } 

    @Override 
    public String getItem(int position) { 

     return mData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 

     return position; 
    } 



    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     int type = getItemViewType(position); 
     System.out.println("getView " + position + " " + convertView + " type = " + type); 
     if (convertView == null){ 
      holder = new ViewHolder(); 
      switch (type) { 
      case TYPE_ITEM: 
       convertView = mInflater.inflate(R.layout.row, null); 
       holder.textView = (TextView) convertView.findViewById(R.id.label); 
       break; 

      case TYPE_SEPARATOR: 
      convertView = mInflater.inflate(R.layout.item2, null); 
      holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); 
      holder.layout = (LinearLayout) convertView.findViewById(R.id.layout); 
      holder.layout.setEnabled(false); 
      holder.textView.setEnabled(false); 


      break; 


      } 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 

     } 
     holder.textView.setText(mData.get(position)); 
     return convertView; 


    } 

} 
public static class ViewHolder { 
    public TextView textView; 
    public LinearLayout layout; 
} 

}

어떤 도움을 주시면 감사하겠습니다.

들으


나는 내 대답을 찾을 생각합니다. 작동하지 않음으로써 의미하는 것은 구분선을 클릭 할 수 있다는 것입니다. 내가해야 할 일은 어댑터에서 allItemsEnabled 메서드를 재정 의하여 false를 반환하고 isEnabled 메서드에서 조건을 만들어 디바이더에 false를 반환하는 것입니다. 다음은 재 작성된 어댑터 코드입니다. 당신이 늘 클릭 할 수 있지만, 사용자가 설정 한 후 ContentView이 퍼팅하는 XML에 퍼팅 때문에

public MyCustomAdapter() { 
     mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final String item) { 
     mData.add(item); 
     notifyDataSetChanged(); 
    } 



    public void addSeparatorItem(final String item) { 
     mData.add(item); 

     // save separator position 
     mSeparatorsSet.add(mData.size() - 1); 
     notifyDataSetChanged(); 
    } 

    //to make dividers not clickable 
    @Override 
    public boolean areAllItemsEnabled() { 

     return false; 
    } 

    //to make dividers not clickable 
    @Override 
    public boolean isEnabled(int position) { 

     int type = getItemViewType(position); 

     if(type==0){ 
      return true; 
     } 

     return false; 

    } 

    @Override 
    public int getItemViewType(int position) { 
     return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 

    } 

    @Override 
    public int getViewTypeCount() { 
     return TYPE_MAX_COUNT; 
    } 

    @Override 
    public int getCount() { 

     return mData.size(); 
    } 

    @Override 
    public String getItem(int position) { 

     return mData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 

     return position; 
    } 



    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     int type = getItemViewType(position); 
     System.out.println("getView " + position + " " + convertView + " type = " + type); 
     if (convertView == null){ 
      holder = new ViewHolder(); 
      switch (type) { 
      case TYPE_ITEM: 
       convertView = mInflater.inflate(R.layout.row, null); 
       holder.textView = (TextView) convertView.findViewById(R.id.label); 
       break; 

      case TYPE_SEPARATOR: 
      convertView = mInflater.inflate(R.layout.item2, null); 
      holder.textView = (TextView)convertView.findViewById(R.id.textSeparator); 
      holder.layout = (LinearLayout) convertView.findViewById(R.id.layout); 
      // holder.layout.setEnabled(false); 
      //holder.textView.setEnabled(false); 


      break; 


      } 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 

     } 
     holder.textView.setText(mData.get(position)); 
     return convertView; 


    } 

} 
public static class ViewHolder { 
    public TextView textView; 
    public LinearLayout layout; 
} 

}

+0

'작동하지 않았다'는 것은 무엇을 의미합니까? 작성한 코드를 사용할 때 어떤 일이 발생합니까? – Luksprog

답변

9

직접 답변을 찾았습니다. 작동하지 않음으로써 의미하는 것은 구분선을 클릭 할 수 있다는 것입니다. 내가해야 할 일은 어댑터에서 areAllItemsEnabled 메서드를 재정의하여 false를 반환하고 isEnabled 메서드에서 조건을 만드는 것입니다 (원래 질문의 후반 참조).

0

난 당신이 겪고있는 문제가 추가하는 ClickListener에 관한 생각 줄 :

목록을 클릭 할 수있게 만듭니다.

0

다른 게시물의 내 ​​answer에 Redering, 당신은 단지 null을 클릭해서는 안됩니다 ViewOnClickListener을 설정해야합니다. 그래서 전화 할게 : view.setOnClickListener(null). 물론 이것을 수행하기 위해 뷰에 대한 참조가 필요합니다 ...