0

以下の画面のスナップショットは、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 を使用しています。

上記のアニメーションである程度の進歩を遂げましたが、リストビュー項目が正しい位置にとどまる (またはスクロールする) ことを確認するのに問題があります。特定のアイテムを拡大および縮小するときに、より広いリストビューの位置を制御するにはどうすればよいですか?

パート B を非表示にしてから表示した画面スナップショットの例


コードは次のとおりです。

/**
 * 类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));
    }

}
4

0 に答える 0