在可见和不可见之间切换填充的列表视图

时间:2015-08-01 19:15:42

标签: android android-layout android-listview android-animation android-togglebutton

我创建了一个包含两个不同文本视图的简单列表视图(如下所示)。我希望有一系列行,在单击时会显示更多信息 - 隐藏一个可以通过单击其他文本视图切换的文本视图。我认为我的问题可能是封装两个文本视图的线性布局,但我不确定。 slide_up和slide_down动画是从网站上获取的基本动画。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:textSize="20sp"
        android:clickable="true"
        android:onClick="toggle_contents"/>
    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="example"
        android:textSize="20sp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"/>

</LinearLayout>

列表视图从内容提供者填充,如下所示:

    cursor.moveToFirst();

    ArrayList<String> listItems = new ArrayList<String>();
    ArrayList<String> listItems2 = new ArrayList<String>();
   //  listItems = new ArrayList<ListItem>();
    ListView mylist=(ListView) findViewById(R.id.list);


    do{
        String id=cursor.getString(cursor.getColumnIndex("id"));
        String name=cursor.getString(cursor.getColumnIndex("name"));
       // String name_str = id +" : "+ name;
        listItems2.add(id);
        listItems.add(name);
        cursor.moveToNext();
    }while(!cursor.isAfterLast());

    CustomListAdapter adapter=new CustomListAdapter(this, listItems2, listItems);
    mylist.setAdapter(adapter);

我希望通过向上滑动和向下滑动动画在可见和不可见之间切换:

public void toggleContents(View v){
        if(txt_hidden.isShown()){
            slide_up(this, txt_hidden);
            txt_hidden.setVisibility(View.GONE);
        }
        else{
            txt_hidden.setVisibility(View.VISIBLE);
            slide_down(this, txt_hidden);
        }
        //txt_hidden.setVisibility(txt_hidden.isShown()? View.GONE : View.VISIBLE);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public static void slide_down(Context ctx, View v){

        Animation a = AnimationUtils.loadAnimation(ctx, R.anim.slide_down);
        if(a != null){
            a.reset();
            if(v != null){
                v.clearAnimation();
                v.startAnimation(a);
            }
        }
    }

    public static void slide_up(Context ctx, View v){

        Animation a = AnimationUtils.loadAnimation(ctx, R.anim.slide_up);
        if(a != null){
            a.reset();
            if(v != null){
                v.clearAnimation();
                v.startAnimation(a);
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

将标记添加到您将OnClickListener()设置为的视图,以便在另一个视图上使用动画

...
view.setOnClickListener(this);
view.setTag(textViewToShowOnClick);
...

public void onClick(View v){
    ...
    TexView textViewToShowOnClick = (TextView) v.getTag();
    v.slideUp(...);
    ...
}

答案 1 :(得分:0)

如何设置txt_hidden变量?我相信它可能指向的视图与您实际尝试更改其可见性的视图不同。

我建议你不要在xml文件中设置点击监听器,而是在构建列表项视图时设置适配器的getView():

private class ViewHolder
{
    TextView mTextView1;
    TextView mTextView2
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view_item_1, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.mTextView1 = (TextView)convertView.findViewById(R.id.text1);
        viewHolder.mTextView2 = (TextView)convertView.findViewById(R.id.text2);
        viewHolder.mTextView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do your animation here
            }
        });
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder)convertView.getTag();
    }

    viewHolder.mTextView1.setText(mElements1.get(position));
    viewHolder.mTextView2.setText(mElements2.get(position));

    return convertView;
}