图库:选定项目中的效果

时间:2014-01-23 04:08:43

标签: android android-viewpager android-gallery

我需要一起滚动项目,所选项目应该展开一部分。

enter image description here

我目前正在使用一个图库(我尝试使用viewflow和viewpager,但这些项目之间有很大的空间),但我需要知道如何才能实现此效果。

我有2个想法,但我不知道如何实现它。

1)可扩展部分是一个LinearLayout,其visibility =已消失,当选择该项时,此布局应该是可见的。 (图库没有“onItemSelectedListener”)

2)将每个元素视为一个片段(一旦我使用一个使用它的Viewpager,https://github.com/mrleolink/SimpleInfiniteCarousel

它不一定是画廊,欢迎任何想法

我正在开展一项活动。

3 个答案:

答案 0 :(得分:2)

取决于您想要的行为。有些问题可以一次扩展多个项目吗?是否要将视图分页(捕捉到位)或平滑滚动它们?

我的一个建议是为单个单元格制作自定义视图。然后以编程方式将它们添加到Horizo​​ntalScrollView对象。

 HorizontalScrollView hsv = new HorizontalScrollView(activity);
 LinearLayout hll = new LinearLayout(activity);
 hll.setOrientation(LinearLayout.HORIZONTAL);
 for(int i=0;i<items.length();i++){
      hsv.addView(new CustomExpandView(item));
 }

CustomExpandView将用于您的单元格,可能是这样的......

public class CustomExpandView extends RelativeLayout implements OnClickListener {

MyActivity mActivity = null;
ImageView ivImage, ivOverImage;
RelativeLayout rlView;

public CustomExpandView(Context context) {
    super(context);
    initialize();
}

public CustomExpandView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public void initialize() {
    mActivity = (MyActivity) this.getContext();
    LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.custom_cell_expand, this, true);

            //you can initialize subviews here
    rlView = (RelativeLayout) getChildAt(0);
    ivImage = (ImageView) rlView.getChildAt(0);
    ivOverImage = (ImageView) rlView.getChildAt(1);

 rlView.setOnFocusChangeListener(new OnFocusChangeListener(){

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            LinearLayout expand = v.findViewById(R.id.view_i_want_to_expand);
            if(hasFocus)
                expand.setVisibility(View.VISIBLE);
            else
                expand.setVisibility(View.GONE);
        }

    });
}

答案 1 :(得分:1)

你自己给出了答案。您可以使用带有片段的ViewPager,并使用动画来扩展窗口的下半部分。取决于您是否希望窗口全屏。 viewpager不一定需要片段,可以使用普通视图和适当的适配器。只需使用它,看看你最喜欢哪种解决方案。

下次,只需创建代码和应用,并提出更具体的问题,并使用代码来说明您遇到的问题。

答案 2 :(得分:1)

您只需定义TableView只需一个TableRow(或根据需要定义),并为onClickListener内的每个View设置一个TableRow <1}},在任何点击时都会显示,所选的View会自行展开。

我不知道你是否会在该行中有静态数量的View,或者你会动态地构建它们,但这应该适用于其中任何一个,真正的“工作”在这里填充那一行。

获得View行后,只需在每个onClickListener()上声明OnClickListener myListener = new OnClickListener() { @Override public void onClick(final View v) { v.setVisibility(View.VISIBLE); } }; 即可。例如,这应该足够了:

onClick

作为TableRow中所有商品的View事件:

for(View v:myTableRowViews)      v.setOnClickListener(myListener的);

这有一个缺点:您可以知道哪个onClick()已被点击以供选择,但原则上您无法知道哪个已被取消选择,因此您需要跟踪最后选择的标签,声明一个类 - 每次触发// In your class declare a variable like this View lastSelected = null; OnClickListener myListener = new OnClickListener() { @Override public void onClick(final View v) { if (lastSelected != null) lastSelected.setVisibility(View.GONE); v.setVisibility(View.VISIBLE); lastSelected = v; } }; 时都会设置宽变量并设置它,这样你的监听器就会变成这样:

layout_height

此外,您可以设置动画效果以使其更具吸引力,但主要是这个想法。

最后一件事:为了让它以这种方式工作,您需要设置TableRowView项目中的View,以便之后可能会扩展将附加部分设置为可见。另外,为了使它看起来很好,所有{{1}} s都必须是相同的高度(在缩小和扩展状态下)。