【问题标题】:Android + Use ViewFlipper to flip individual items within a ListView?Android + 使用 ViewFlipper 翻转 ListView 中的单个项目?
【发布时间】:2011-08-04 19:15:07
【问题描述】:

这可能是一个愚蠢的问题。

我知道我可以在 ViewFlipper 中包装 ListView,但是我们可以在 ViewFlipper 中包装单个 ListView 项吗?例如,最新的 Twitter 应用程序使用 ListView 来显示推文。它还允许您通过将推文滑开以显示下面的设置选项图标来设置单个项目的设置。这是自定义实现还是我们有能力使用 ListView 和 ViewFlipper 创建类似的东西?谢谢,不胜感激!


我在这方面花了一些时间,并让 ListView 通过 ViewFlipper 显示其他内容。但是,视图似乎只在 ListView 中的最后一项上“翻转”。单击时如何使每个项目翻转?这是一些代码:

row.xml

<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flipper" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:id="@+id/toptext" android:layout_width="fill_parent"
                android:layout_height="0dip" android:layout_weight="1"
                android:gravity="center_vertical" />
    <TextView android:id="@+id/bottomtext" android:layout_width="fill_parent"
                android:layout_height="0dip" android:layout_weight="1"
                android:gravity="center_vertical" />
</ViewFlipper>

ma​​in.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView android:id="@id/android:list" android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

ListActivityView.java - 扩展 ListActivity

    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    ...
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        // doesn't matter which line is clicked
        // only the last item in the ListView displays the bottomText
        viewFlipper.showNext(); 
    }

ListingAdapter.java - 扩展 ArrayAdapter

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);

            viewFlipper = (ViewFlipper) v.findViewById(R.id.flipper);
        }

【问题讨论】:

    标签: android listview viewflipper


    【解决方案1】:

    如果我的问题是正确的 - 您可以在定义列表中的一行的布局中使用 ViewFlipper,并在呈现相应视图时按照您喜欢的方式初始化它

    【讨论】:

    • 我已经尝试过这样做,但还没有成功。如果我仍然无法让它工作,我今晚会再打几下并发布代码。感谢您的回复!
    • viewFlipper 似乎是一个成员 - 所以它总是引用 getView() 返回的最后一项。在调用showNext()之前,您需要在onListItemClick() 中重新初始化它
    • 您能否就重新启动它进行更多说明?谢谢!请注意,我将 ViewFlipper 换成了 FrameLayout,但我仍然遇到同样的问题。也代替“viewFlipper.showNext();”我使用自定义动画。
    • getView 为您列表中的每个项目调用。由于您在getView 中初始化viewFlipper,它将始终从正在处理的最后一个列表项中引用ViewFlipper 视图(这就是为什么无论您单击什么,您总是在最后一个列表行上看到翻转)。作为一种解决方案,您可以在onListItemClick 中初始化viewFlipper(就在调用showNext 之前),从而确保您从被单击的行中引用flipper。
    【解决方案2】:
    Below code helps you achieve a requirement for having a view flipper in list view with invidual row flipping
    ## xml file ##
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/regularLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin">
    
        <ViewFlipper
            android:id="@+id/row_item_flipper"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <LinearLayout
                android:layout_width="match_parent"
                android:orientation="vertical"
                android:layout_height="match_parent">
                <TextView
                    android:id="@+id/list_item"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Regular Layout"
                    android:textSize="28sp" />
    
                <Button
                    android:text="Flip"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/front_button" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:orientation="vertical"
                android:layout_height="match_parent">
                <TextView
                    android:id="@+id/backTextView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Flip row done"
                    android:textSize="18sp" />
    
                <Button
                    android:text="Flip back"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/back_button" />
            </LinearLayout>
        </ViewFlipper>
    </LinearLayout>
    
    
    ----------
    ## Java code ##
    
    
        @Override
        public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false);
            return new ItemViewHolder(itemView);
        }
    
        @Override
        public void onBindViewHolder(final ItemViewHolder holder, int position) {
    
            final CustomItem data = dataList.get(position);
                holder.regularLayout.setVisibility(View.VISIBLE);
                holder.swipeLayout.setVisibility(View.GONE);
                holder.listItem.setText(data.dataItemValue );
                holder.backTextView.setText(data.dataItemValue + " position : "+ position);
                holder.viewFlipper.setFlipInterval(0);
                holder.viewFlipper.setInAnimation(null);
                holder.viewFlipper.setOutAnimation(null);
                if(holder.viewFlipper.getDisplayedChild()==0 && data.isFlipON){
                    holder.viewFlipper.setDisplayedChild(1);
                } else if(holder.viewFlipper.getDisplayedChild()==1 && !data.isFlipON){
                    holder.viewFlipper.setDisplayedChild(0);
                }else if(data.isFlipON){
                    holder.viewFlipper.setDisplayedChild(1);
                }else{
                    holder.viewFlipper.setDisplayedChild(0);
                }
    
    
    
            holder.frontButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    AnimationFactory.flipTransition(holder.viewFlipper, AnimationFactory.FlipDirection.LEFT_RIGHT);
                    data.isFlipON = true;
                }
            });
            holder.backButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    data.isFlipON = false;
    
                    AnimationFactory.flipTransition(holder.viewFlipper, AnimationFactory.FlipDirection.LEFT_RIGHT);
                }
            });
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多