在列表视图中维护视图翻转器的状态
问题描述:
我将视图翻转器视为列表视图项目,并在运行时将项目加载到视图翻转器。在列表视图中维护视图翻转器的状态
问题:我的问题是当我将视图翻转到特定的行时,并且当我滚动列表视图时,在翻转到右侧后被设置到特定位置的视图丢失。
在滚动所有行中的视图鳍状肢时重新初始化为第0状态。
这里是我的底座适配器:
public class ListViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<TypeOneDataClass> typeOneList;
private LayoutInflater inflater;
public static ArrayList<ViewPager> myPagers = new ArrayList<ViewPager>();
private ArrayList<Integer> myInnerList;
//public static ArrayList<ArrayList<Integer>> myList = new ArrayList<ArrayList<Integer>>();
private ArrayList<FlipperPosition> myFlipList = new ArrayList<FlipperPosition>();
public ListViewAdapter(Context context,
ArrayList<TypeOneDataClass> typeOneList) {
this.context = context;
this.typeOneList = typeOneList;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return typeOneList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return typeOneList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return IGNORE_ITEM_VIEW_TYPE;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
FlipperPosition flipperPosition;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_item, null, false);
holder.viewFlipper = (ViewFlipper)convertView.findViewById(R.id.myFlipper);
for(int i=0;i<typeOneList.get(position).getDetailsList().size();i++){
View v = inflater.inflate(R.layout.pager_item, null);
holder.viewFlipper.addView(v);
final TextView tv_name = (TextView)v.findViewById(R.id.tv_name);
final TextView tv_fathersName = (TextView)v.findViewById(R.id.tv_fathersname);
Button btn_right = (Button)v.findViewById(R.id.btn_right);
Button btn_left = (Button)v.findViewById(R.id.btn_left);
final ViewHolder vHolder = holder;
btn_left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vHolder.viewFlipper.setInAnimation(context, R.anim.slide_in_left);
vHolder.viewFlipper.setOutAnimation(context, R.anim.slide_out_right);
vHolder.viewFlipper.showPrevious();
Toast.makeText(context, "Row"+position+" "+vHolder.viewFlipper.indexOfChild(vHolder.viewFlipper.getCurrentView()), 0).show();
}
});
btn_right.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vHolder.viewFlipper.setInAnimation(context, R.anim.slide_in_right);
vHolder.viewFlipper.setOutAnimation(context, R.anim.slide_out_left);
vHolder.viewFlipper.showNext();
int indexofFliper = vHolder.viewFlipper.indexOfChild(vHolder.viewFlipper.getCurrentView());
Toast.makeText(context, "Row"+position+" "+indexofFliper, 0).show();
}
});
tv_name.setText(typeOneList.get(position).getName());
tv_fathersName.setText(typeOneList.get(position).getDetailsList().get(myFlipList.get(position).getFlipTermSet()).getFathersname());
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
class ViewHolder {
ViewFlipper viewFlipper;
}
答
我不知道TypeOneDataClass
是什么,但我会建议增加一个额外的字段给它,如:
int lastDisplayed;
然后你可以改变你的按钮来保存当前状态:
btn_left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vHolder.viewFlipper.setInAnimation(context, R.anim.slide_in_left);
vHolder.viewFlipper.setOutAnimation(context, R.anim.slide_out_right);
vHolder.viewFlipper.showPrevious();
// SAVE STATE
typeOneList.get(position).lastDisplayed = vHolder.viewFlipper.getDisplayedChild();
}
});
btn_right.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vHolder.viewFlipper.setInAnimation(context, R.anim.slide_in_right);
vHolder.viewFlipper.setOutAnimation(context, R.anim.slide_out_left);
vHolder.viewFlipper.showNext();
// SAVE STATE
typeOneList.get(position).lastDisplayed = vHolder.viewFlipper.getDisplayedChild();
}
});
最后,你需要恢复那个状态wh该行回到视图中。
convertView.setTag(holder);
// RESTORE STATE
holder.viewFlipper.setDisplayedChild(typeOneList.get(position).lastDisplayed);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
谢谢@j__m,寻求帮助。为我工作就像一个魅力。 –