以下の画面のスナップショットは、5 つの項目を表示するリストビューを示しています。それぞれの項目は、A と B の 2 つの部分で構成されています。リストビューには、最初はこれら 5 つの項目が表示され、デフォルトではそれぞれの部分 B が非表示になっています。ユーザーは、パーツ A をクリックして、それぞれのパーツ B を表示または非表示にできるようにする必要があります。ユーザーが 5 番目の項目をタップすると、リストビュー全体 (パーツ A を含む) を 5 より上に移動するアニメーションを作成して、 5番目のアイテムのパートB。または、4 番目のアイテムのパート B を表示したい場合は、4 番目のアイテムをクリックした後、アイテム 5 を下にシフトして、アイテム 4 のパート B のためのスペースを空けたいと思います。リストビューの位置を変更して、新しく公開されたパーツ B のためのスペースを確保します。
listview.setSelection(3)
配置されたアイテムがリストの一番上にスクロールされることを私は知っています。また、私は にも精通してlistview.smoothScrollToPosition(8)
いますが、この方法には api 8 が必要ですが、私たちのプロジェクトではバージョン 7 を使用しています。
上記のアニメーションである程度の進歩を遂げましたが、リストビュー項目が正しい位置にとどまる (またはスクロールする) ことを確認するのに問題があります。特定のアイテムを拡大および縮小するときに、より広いリストビューの位置を制御するにはどうすればよいですか?
コードは次のとおりです。
/**
* 类SubCategoryAdapter.java的实现描述:TODO 类实现描述
* @author xianyi.chengxy 2012-8-17 下午7:39:47
*/
public class SubCategoryAdapter extends BaseListAdapter<IndustryNavigationData> {
private Context mContext ;
private LayoutInflater mInflater ;
private ListView mListView ;
static String defaultName = "subCategory.png" ;
private int mPreVisiPosition = -1 ;
private int mVisiPosition = -1 ;
public SubCategoryAdapter( Context context , int visiPosition, ListView listView ){
super(context) ;
this.mContext = context.getApplicationContext() ;
this.mInflater = LayoutInflater.from(mContext) ;
this.mVisiPosition = visiPosition ;
this.mListView = listView ;
}
public void setVisiPosition(int visiPosition){
this.mVisiPosition = visiPosition ;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if( convertView == null ){
convertView = mInflater.inflate(R.layout.v2_subcategory_listitem, null) ;
NoScrollGridView gridView = (NoScrollGridView) convertView.findViewById(R.id.subCategory_groupView_gridView) ;
gridView.setNumColumns(5) ;
final BaseListAdapter<IndustryNavigationData> listAdapter = new SubCategoryGridViewAdapter(mContext) ;
gridView.setAdapter(listAdapter) ;
gridView.setTag(listAdapter) ;
ViewHold viewHold = new ViewHold() ;
viewHold.gridLayout = (LinearLayout) convertView.findViewById(R.id.subCategory_groupView_gridViewLayout) ;
viewHold.imageView = (ImageView_) convertView.findViewById(R.id.subCategory_groupView_imageview) ;
viewHold.name = (TextView) convertView.findViewById(R.id.subCategory_groupView_name) ;
viewHold.childsName = (TextView) convertView.findViewById(R.id.subCategory_groupView_childs) ;
viewHold.gridView = gridView ;
// TO search
viewHold.gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
UILogUtils.saveAndAppendLogType(LogTypeCode.APP_DRESSCATEGORY_BROWSER_TWO);
MyOfferRequest request = new MyOfferRequest();
IndustryNavigationData item = listAdapter.getItem(position);
if (IndustryNavigationDataType.LEFT_CATEGORY.equals(item
.getType())) {
request.setCategoryId(item.getId());
request.setCategoryName(item.getName());
} else if (IndustryNavigationDataType.LEFT_KEYWORD
.equals(item.getType())) {
request.setCategoryId(item.getId());
request.setKeywords(item.getName());
}
ActivityUtil.gotoSearchOfferList(request, mContext, true);
}
});
viewHold.groupLayout = convertView.findViewById(R.id.subCategory_groupLayout) ;
viewHold.groupLayout.setOnClickListener(clickListener) ;
convertView.setTag(viewHold) ;
}
ViewHold viewHold = (ViewHold) convertView.getTag() ;
viewHold.position = position ;
IndustryNavigationData item = group.get(position) ;
viewHold.groupLayout.setTag(viewHold) ;
String url = item.getImageUrl() ;
if( url != null ){
viewHold.imageView.setImageResource(item.getImageUrl(), 110, 110, R.drawable.default_image) ;
}
viewHold.name.setText( item.getName() );
StringBuffer sb = new StringBuffer() ;
List<IndustryNavigationData> childs = item.getChildren() ;
if( (childs!=null) && (childs.size()!=0) ){
for( IndustryNavigationData itemChild : item.getChildren() ){
sb.append(itemChild.getName()).append("/") ;
}
sb.deleteCharAt(sb.length()-1) ;
viewHold.childsName.setText(sb.toString()) ;
}else{
viewHold.childsName.setText("") ;
}
BaseListAdapter<IndustryNavigationData> gridViewAdapter = (BaseListAdapter<IndustryNavigationData>) viewHold.gridView.getTag() ;
gridViewAdapter.setList(item.getChildren()) ;
if( (this.mVisiPosition==position) && (item.getChildren()!=null) && (item.getChildren().size()!=0) ){
scrollView(viewHold, item, ExpandCollapseAnimation.EXPAND);
viewHold.gridLayout.setVisibility(View.VISIBLE) ;
}else{
if( position == this.mPreVisiPosition ){
// viewHold.gridLayout.setVisibility(View.GONE) ;
mPreVisiPosition = -1 ;
scrollView(viewHold, item, ExpandCollapseAnimation.COLLAPSE);
}else{
viewHold.gridLayout.setVisibility(View.GONE) ;
}
}
return convertView;
}
private class ViewHold{
public int position ;
public View groupLayout ;
public LinearLayout gridLayout ;
public ImageView_ imageView ;
public TextView name ;
public TextView childsName ;
public NoScrollGridView gridView ;
}
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
UILogUtils.saveAndAppendLogType(LogTypeCode.APP_DRESSCATEGORY_BROWSER_ONE);
ViewHold hold = (ViewHold) v.getTag() ;
if( (mVisiPosition!=hold.position) || (hold.gridLayout.getVisibility()!=View.VISIBLE) ){
mPreVisiPosition = mVisiPosition ;
mVisiPosition = hold.position ;
notifyDataSetChanged() ;
// scrollView(hold, getItem(mVisiPosition), ExpandCollapseAnimation.EXPAND) ;
// mListView.setSelection(mVisiPosition-1) ;
}else{
mPreVisiPosition = mVisiPosition ;
mVisiPosition = -1 ;
notifyDataSetChanged() ;
// notifyDataSetChanged() ;
}
}
};
/**
* @param viewHold
* @param item
*/
private void scrollView(ViewHold viewHold, IndustryNavigationData item, int scrollType) {
int childSize = item.getChildren().size() ;
int row = childSize / 5 ;
row = childSize%5==0? row:row+1 ;
LayoutParams lp = viewHold.gridLayout.getLayoutParams() ;
int heightDip = 37+(row-1)*13 ;
int heightPx = DisplayUtil.dipToPixel(heightDip)+row*98 ;
int time = heightPx*2 ;
lp.height = heightPx ;
viewHold.gridLayout.setLayoutParams(lp) ;
viewHold.gridLayout.startAnimation(new ExpandCollapseAnimation(viewHold.gridLayout, time, scrollType, mListView, viewHold.position));
}
}