ListViewの順番がスクロールするたびに変わってしまう。
AndroidのListViewに関する質問です。
http://www.breakingwap.com/wp-content/uploads/8924-a.sc.jpg
上のリンクのようなNavigationDrawer
でなおかつ、この画像でいう、アイコンやメールアドレスがある部分とFooterに当たる部分をNavigationDrawer
の上部、下部に固定したレイアウトを作りたいと思いまして、以下のようなレイアウトで書いたのですが、例えば、縦画面などで、ListViewをスクロールする必要がなく、要素がすべて表示されるときには、正しく表示されるのですが、横画面などでListViewのスクロールが必要なときにスクロールをするたびにそのListViewの順番が変わってしまいます。
NavigationDrawerのレイアウトの概略
<LinearLayout>
<RelativeLayout>
//View
</RelativeLayout>
<ListView
android:layout_weight="1"
</ListView>
<LinearLayout>
//View
</LinearLayout>
</LinearLayout
また、以下のサイトを参考にしました。
http://d.hatena.ne.jp/windbell/20120701
http://d.hatena.ne.jp/nkawamura/20130818/1376815735
回答よろしくお願いします。
追記(リストアダプター)
//ListViewのViewHolder
private static class ViewHolder{
TextView textView;
ImageView imageView;
LinearLayout itemParent;
}
//ListViewのItemデータ
private class NavigationDrawerItem {
public String text;
public int icon;
public NavigationDrawerItem(String text, int icon){
this.text=text;
this.icon=icon;
}
}
//CustomArrayAdapter
private class NavigationDrawerAdapter extends ArrayAdapter<NavigationDrawerItem>{
private LayoutInflater inflater;
private int resourceId;
public NavigationDrawerAdapter(Context context, int resource, List<NavigationDrawerItem> objects) {
super(context, resource, objects);
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.resourceId=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if(convertView==null){
convertView=inflater.inflate(resourceId, parent, false);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.text);
holder.imageView = (ImageView)convertView.findViewById(R.id.icon);
holder.itemParent = (LinearLayout)convertView.findViewById(R.id.item_parent);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
if(!isEnabled(position)){
//区切り線を入れる
View border = new View(getActivity());
border.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1));
border.setBackgroundColor(getResources().getColor(R.color.border_color));
holder.itemParent.addView(border);
}else{
if(mCurrentSelectedPosition==position){
holder.itemParent.setBackgroundResource(R.color.selected);
}else{
holder.itemParent.setBackgroundResource(android.R.color.white);
}
NavigationDrawerItem item = getItem(position);
holder.imageView.setImageResource(item.icon);
holder.textView.setText(item.text);
}
return convertView;
}
@Override
public boolean isEnabled(int position){
return !(getItem(position).text.startsWith("-"));
}
}