2014-06-14 133 views
0

我知道这是不是这个话题复选框和列表视图的第一个问题,但我不知道该怎么办..CheckedTextView ListView的页眉 - 排序

我有CheckedTextView和TextView的,如果一个ListView我滚动一些其他的将得到遏制...... 的观点得到使出太和启用/禁用部分(带有SharedPref)也不起作用......

使用:
lalit3686 Blog
Android ListView Headers

所以有我的代码:

ActivtyMain.java

public class ActivityMain extends NavigationDrawerActivity{ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_main); 
    super.onCreate(savedInstanceState); 
    context=this; 

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

    character_header_id.add(0); 
    character_header_id.add(character_original.size()+1); 
    character_header_id.add(character_original.size()+character_extension1.size()+2); 
    character_header_id.add(character_original.size()+character_extension1.size()+character_extension2.size()+3); 

    items.add(new CharacterHeader(getString(R.string.character_original))); 
    for(character key:character_original) { 
     String value=character_translation.get(key); 
     //System.out.println(value); 
     items.add(new CharacterListItem(value)); 
    } 
    items.add(new CharacterHeader(getString(R.string.character_extension1))); 
    for(character key:character_extension1) { 
     String value=character_translation.get(key); 
     items.add(new CharacterListItem(value)); 
    } 
    items.add(new CharacterHeader(getString(R.string.character_extension2))); 
    for(character key:character_extension2) { 
     String value=character_translation.get(key); 
     items.add(new CharacterListItem(value)); 
    } 
    items.add(new CharacterHeader(getString(R.string.character_extension3))); 
    for(character key:character_extension3) { 
     String value=character_translation.get(key); 
     items.add(new CharacterListItem(value)); 
    } 

    lv_charactere=((ListView) findViewById(R.id.character_list)); 
    lv_charactere.setAdapter(new CharacterArrayAdapter(this, items)); 

    //TODO check/unceck scroll problem 
    lv_charactere.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if(!character_header_id.contains(position)) { 
       CheckedTextView ctv = (CheckedTextView) view.getTag(R.id.listitem_character); 
       //CheckedTextView ctv = (CheckedTextView) view.findViewById(R.id.list_character); 

       System.out.println("character:position:"+position); 
       NavigationDrawerActivity.setCharacterCheckedTextViewChecked(ctv); 
      } 
     } 
    }); 
} 

CharacterArrayAdapter.java

public class CharacterArrayAdapter extends ArrayAdapter<Item> { 
private LayoutInflater mInflater; 
private List<Item> items; 

public enum RowTypeText { 
    CHECKED_ITEM, TITLE_ITEM 
} 

public CharacterArrayAdapter(Context context, List<Item> items) { 
    super(context, 0, items); 
    mInflater = LayoutInflater.from(context); 
    this.items=items; 
} 

@Override 
public int getViewTypeCount() { 
    return RowTypeText.values().length; 
} 

@Override 
public int getItemViewType(int position) { 
    return getItem(position).getViewType(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder = new ViewHolder(); 
    if (convertView == null) { 
     if(items.get(position).getClass().equals(CharacterListItem.class)) { 
      convertView = mInflater.inflate(R.layout.character_list_item, null); 

      viewHolder.checkedtextview = (CheckedTextView) convertView.findViewById(R.id.listitem_character); 
      viewHolder.checkedtextview.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        CheckedTextView ctv=((CheckedTextView)((CharacterListItem)items.get(getPosition)).getView(mInflater, v)); 
        //ctv.setChecked(!((CheckedTextView) v).isChecked()); // Set the value of checkbox to maintain its state. 
        NavigationDrawerActivity.setCharacterCheckedTextViewChecked(ctv); 
        System.out.println("character:position:"+getPosition); 
       } 
      }); 
      viewHolder.checkedtextview.setTag(position); 

      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.listitem_character, viewHolder.checkedtextview); 
     }else{ 
      convertView = mInflater.inflate(R.layout.character_header, null); 

      viewHolder.textview=(TextView) convertView.findViewById(R.id.listheader_character); 
      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.listheader_menu, viewHolder.textview); 
     } 
    }else{ 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    if(viewHolder.checkedtextview!=null) { 
     int pos=(int)viewHolder.checkedtextview.getTag(); // This line is important. 
     viewHolder.checkedtextview.setChecked(((CheckedTextView)((CharacterListItem)items.get(pos)).getView(mInflater, viewHolder.checkedtextview)).isChecked()); 

     loadSettings(viewHolder, position); 

     return convertView; 
    }else{ 
     return getItem(position).getView(mInflater, convertView); 
    } 
    //return getItem(position).getView(mInflater, convertView); 
} 

private void loadSettings(ViewHolder viewHolder, int position) { 
    //TODO select if selected before 
    for(Map.Entry<character, String> e:NavigationDrawerActivity.character_translation.entrySet()) { 
     if(e.getValue().equals(viewHolder.checkedtextview.getText())) { 
      if(NavigationDrawerActivity.character_playing.get(e.getKey())==0) { 
       viewHolder.checkedtextview.setChecked(false); 
       System.out.println("character:loadSaved: "+position+" checked:false"); 
      }else{ 
       if(viewHolder.checkedtextview.getText().equals(NavigationDrawerActivity.character_translation.get(character.DERNORMALEDORFBEWOHNER)) || 
         viewHolder.checkedtextview.getText().equals(NavigationDrawerActivity.character_translation.get(character.WERWOLF))){ 

        System.out.println("character:loadSaved: "+position+" disabled"); 
        NavigationDrawerActivity.setCharacterCheckedTextViewEnabled(viewHolder.checkedtextview, false, true); 
       }else{ 
        System.out.println("character:loadSaved: "+position+" checked:true"); 
        viewHolder.checkedtextview.setChecked(true); 
       } 
      } 
     } 
    } 

    //TODO settings -> enable/disable 
    boolean ex1=NavigationDrawerActivity.spref.getBoolean(prefs.BOOLEAN_EXTENSION1.toString(), false); 
    boolean ex2=NavigationDrawerActivity.spref.getBoolean(prefs.BOOLEAN_EXTENSION2.toString(), false); 
    boolean ex3=NavigationDrawerActivity.spref.getBoolean(prefs.BOOLEAN_EXTENSION3.toString(), false); 

    for(Entry<character, String> e:NavigationDrawerActivity.character_translation.entrySet()) { 
     if(e.getValue().equals(viewHolder.checkedtextview.getText())) { 
      if(NavigationDrawerActivity.character_extension1.contains(e.getKey())) { 
       System.out.println("character:loadSaved: "+position+" enabled:"+ex1); 
       NavigationDrawerActivity.setCharacterCheckedTextViewEnabled(viewHolder.checkedtextview, ex1, false); 
      } 
     } 
     if(e.getValue().equals(viewHolder.checkedtextview.getText())) { 
      if(NavigationDrawerActivity.character_extension2.contains(e.getKey())) { 
       System.out.println("character:loadSaved: "+position+" enabled:"+ex2); 
       NavigationDrawerActivity.setCharacterCheckedTextViewEnabled(viewHolder.checkedtextview, ex2, false); 
      } 
     } 
     if(e.getValue().equals(viewHolder.checkedtextview.getText())) { 
      if(NavigationDrawerActivity.character_extension3.contains(e.getKey())) { 
       System.out.println("character:loadSaved: "+position+" enabled:"+ex3); 
       NavigationDrawerActivity.setCharacterCheckedTextViewEnabled(viewHolder.checkedtextview, ex3, false); 
      } 
     } 
    } 
} 

private static class ViewHolder{ 
    protected CheckedTextView checkedtextview; 
    protected TextView textview; 
} 
} 

NavigationDrawerActivity.java

public static void setCharacterCheckedTextViewChecked(CheckedTextView ctv) { 
    for(Entry<character, String> e:character_translation.entrySet()) { 
     if(e.getValue().equals(ctv.getText())) { 
      if(ctv.isChecked()) { 
       ctv.setChecked(false); 
       character_playing.put(e.getKey(),0); 
      }else{ 
       ctv.setChecked(true); 
       if(e.getKey().equals(character.DERNORMALEDORFBEWOHNER) || e.getKey().equals(character.WERWOLF)) { 
        character_playing.put(e.getKey(),-1); 
       }else { 
        character_playing.put(e.getKey(),1); 
       } 
      } 
      break; 
     } 
    } 
} 

public static void setCharacterCheckedTextViewEnabled(CheckedTextView ctv, boolean enabled, boolean checked) { 
    ctv.setEnabled(enabled); 
    ctv.setClickable(enabled); 
    ctv.setLongClickable(enabled); 
    ctv.setChecked(checked); 
} 

ListViewCharacter.java

public class CharacterListItem implements Item { 
private final String str; 

public CharacterListItem(String text) { 
    this(text, false); 
} 
public CharacterListItem(String text, boolean selected) { 
    if(text==null) { 
     text=""; 
    } 
    str=text; 
} 

@Override 
public int getViewType() { 
    return RowTypeText.CHECKED_ITEM.ordinal(); 
} 

@Override 
public View getView(LayoutInflater inflater, View convertView) { 
    View view; 
    if (convertView == null) { 
     view = (View) inflater.inflate(R.layout.character_list_item, null); 
    } else { 
     view = convertView; 
    } 

    CheckedTextView tv=(CheckedTextView) view.findViewById(R.id.listitem_character); 
    tv.setText(str); 
    return view; 
} 
} 

我认为我发布的所有重要的代码部分,如果缺少了什么,请让我知道 我不知道该怎么办..

回答

0

getView

ViewHolder viewHolder = new ViewHolder(); 
if (convertView == null) { 
    if(items.get(position).getClass().equals(CharacterListItem.class)) { 
     convertView = mInflater.inflate(R.layout.character_list_item, null); 

     viewHolder.checkedtextview = (CheckedTextView) convertView.findViewById(R.id.listitem_character); 
     viewHolder.checkedtextview.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onClickListener(v); 
      } 
     }); 

     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.listitem_character, viewHolder.checkedtextview); 
    }else{ 
     convertView = mInflater.inflate(R.layout.character_header, null); 

     viewHolder.textview=(TextView) convertView.findViewById(R.id.listheader_character); 

     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.listheader_menu, viewHolder.textview); 
    } 
}else{ 
    viewHolder = (ViewHolder) convertView.getTag(); 
} 

if(viewHolder.checkedtextview!=null) { 
    viewHolder.checkedtextview.setTag(position); // This line is important. 
    viewHolder.checkedtextview.setText(items.get(position).getText());; 

    loadSettings(viewHolder); 

    return convertView; 
}else{ 
    return getItem(position).getView(mInflater, convertView); 
} 

重要变化(我是这么认为的): 只在T他第二部分设置位置