【问题标题】:RecyclerView: how to add OnClick() and keep onLongClick() working?RecyclerView:如何添加 OnClick() 并保持 onLongClick() 工作?
【发布时间】:2017-12-13 00:13:56
【问题描述】:

我在CheckBox 上设置了一个onClickListener,用于包含CardViews 列表的RecyclerView。监听器设置在我的ItemHolder 中,扩展了ViewHolder。初次单击CardView 会检查CheckBox 并将CardView 的背景颜色从默认的白色切换为红色。这工作正常。

我还在CardView 本身上设置了一个OnClickListenerOnClickListener 设置在onCreateViewHolder() 中。单击CardView 会为CardView 启动一个新的详细信息活动。这工作正常。

最后,我尝试在 CardView 本身上设置一个onLongClickListenerOnLongClickListener 在 onCreateViewHolder() 中设置。长按 CardView 意味着将背景颜色切换为红色并启动 AlertDialog,以便用户可以确认 CardView 将从列表中删除。这可以正常工作,但是当将此代码添加到适配器时,CardView 的 CheckBox 的 OnClickListerner 将不再工作。就好像OnLongClickListner 与 CheckBox 侦听器发生冲突。请注意,我在 itemHolder 的 onLongClick() 代码中“返回 true”。我在这里错过了什么?

Adapter.java

public MyRecylerAdapter(Context context, ArrayList<ListItem> listItems, ArrayList<ListItem> selectedList) {
    this.mContext = context;
    this.mListItems = listItems;
    this.selectedItemsList = selectedList;
}

private int selectedPos = -1;
...

private class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private CardView cardView;
    private CheckBox chkSelected;

    private ItemHolder(final View itemView) {
        super(itemView);

        cardView = (CardView) itemView.findViewById(R.id.singlecard_view1);
        chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
        chkSelected.setOnClickListener(this);
    }

    public void onClick(View v) {

        int adapterPos = getAdapterPosition();

        if (adapterPos == android.support.v7.widget.RecyclerView.NO_POSITION) return;
        if (recyclerItemClickListener !=null) {
            recyclerItemClickListener.onCheckBoxClick(v, adapterPos);
        }
        Integer iPos = adapterPos;

        if (((CheckBox)v).isChecked()) {
            checkedListItems.add(iPos);
        }
        else {
            checkedListItems.remove(iPos);
        }
    }

    void bind(int position) {

        if (checkedListItems.contains(position)) {
            chkSelected.setChecked(true);
        }
        else {
            chkSelected.setChecked(false);
        }
    }
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
    final ItemHolder itemHolder = new ItemHolder(view);

        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            // Handles the row being clicked.
            @Override
            public void onClick(View view) {

                ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 

                if (recyclerItemClickListener != null) {
                    recyclerItemClickListener.onItemClick(itemHolder.itemView, adapterItem);
                }
            }
        });

        itemHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                ListItem adapterItem2 = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 

                    if (recyclerItemClickListener != null) {
                        recyclerItemClickListener.onItemLongClick(itemHolder.itemView, adapterItem2);
                    }

                int adapterPos2 = itemHolder.getAdapterPosition(); 
                if (adapterPos2 != android.support.v7.widget.RecyclerView.NO_POSITION) {
                    int lastSelectedPosition = selectedPos;
                    selectedPos = adapterPos2;
                    notifyItemChanged(lastSelectedPosition);
                    notifyItemChanged(selectedPos);
                }                    
                return true;
            }
        });
    return itemHolder;
}

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

    final ListItem listItem = mListItems.get(position);
    final ItemHolder itemHolder = (ItemHolder) holder;

    itemHolder.bind(position);

    if (checkedListItems.contains(position)) {
        itemHolder.cardView.setActivated(true);
    }
    else {
        itemHolder.cardView.setActivated(false);
    }        

    // **The addition of the below code causes the "itemHolder.cardView.
    // setActivated(true);" in onBindViewHolder method to no longer fire, as 
    // a click on the CheckBox no longer changes the CardView background 
    // color.**
    if (itemHolder.getAdapterPosition() == selectedPos) {
        itemHolder.cardView.setActivated(true);
    } else {
        itemHolder.cardView.setActivated(false);
    }

list_contact_item.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singlecard_view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:attr/selectableItemBackground"
     >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/statelist_cardview_background"  >

    <CheckBox
        android:id="@+id/chkSelected"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="4dp"
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:gravity="center"  />

    <TextView
        android:id="@+id/cardType1"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_toRightOf="@+id/chkSelected"
        android:layout_toEndOf="@+id/chkSelected"
        android:layout_alignParentTop="true"
        android:paddingStart="3dp"
        android:paddingLeft="3dp"
        android:paddingEnd="6dp"
        android:paddingRight="6dp"
        android:layout_marginTop="4dp"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textStyle="bold|italic"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />

    <TextView
        android:id="@+id/cardBlankText1"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/cardType1"
        android:layout_toEndOf="@+id/cardType1"
        android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
        android:layout_toStartOf="@+id/cardBlankTextNumstotal"
        android:layout_marginTop="4dp"
        android:gravity="center_vertical|end"
        android:text="#"
        android:textColor="@color/colorFlLabelFinal"
        android:textStyle="bold"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />

    <TextView
        android:id="@+id/cardBlankTextNumstotal"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:text="actual card #"
        android:layout_marginTop="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginEnd="4dp"
        android:freezesText="true"
        android:textColor="@android:color/black"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Subhead"  />        

    <TextView
        android:id="@+id/cardBlankText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/chkSelected"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="6dp"
        android:layout_marginStart="6dp"
        android:text="todo"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:background="@drawable/todo_underline"
        android:maxLines="1"
        style="@style/Base.TextAppearance.AppCompat.Headline"  />

    ...
    </RelativeLayout>

</android.support.v7.widget.CardView>

statelist_cardview_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true"

        android:drawable="@color/item_selected" />

    <item android:state_activated="false"

        android:drawable="@color/list_contact_item_default"  />

</selector>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="list_contact_item_default">#FFFFFF</color>
    <color name="item_selected">#FF0000</color>

</resources>

【问题讨论】:

  • 使用chkSelected.setOnCheckedChangeListener() 代替chkSelected.setOnClickListener(this) 并在onCreateViewHolder() 中执行此操作
  • 通过阅读许多以前的帖子,不少人提到将 onCheckedChangeListener() 方法与 RecyclerView 适配器一起使用存在问题。
  • 你可以通过holder.vChecked.setOnCheckedChangeListener(null);管理这个然后调用bind()然后分配holder.vChecked.setOnCheckedChangeListener(new OnCheckedChangeListener() ....);`
  • 好的,我们的想法是通过对 CheckBox 点击事件使用 onCheckedChangeListener 而不是使用第二个 onClickListener 来减少点击冲突的可能性?
  • 是的,如果您仍想使用,请尝试在onCreateViewHolder()ItemHolder 的单个位置进行管理

标签: android checkbox android-recyclerview


【解决方案1】:

你为什么不使用 OnCheckedChangeListener 作为复选框?

CheckBox chkBox = ( CheckBox ) findViewById( R.id.checkbox );
chkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
            // perform logic
        }

    }
});

【讨论】:

  • 通过阅读大量 stackoverflow 帖子,开发人员在 RecyclerView 的 Adapter 中遇到了 onCheckedChangeListener 的问题。
  • 所以,@AJW 你认为我的回答最适合你的问题吗?
  • 呵呵,,,其他人在看到我添加 CheckBox Listener 的答案后编辑或发布新答案...
【解决方案2】:

您似乎在这里尝试解决错误的问题。您应该不要在卡片视图本身上设置点击和长按侦听器

  • 您可以在复选框上设置点击监听器或checkedChangeListener
  • 单击和长按侦听器可以位于 view_container 的其余部分

如果您想选中/取消选中复选框点击 view_container,您可以在 view_container 的 onClick 侦听器中轻松完成。

编辑: 我已经更新了您的布局文件,请注意现在您在 FrameLayout 上作为 RelativeLayout(view_container) 和 Checkbox 的父级。

由于在 RelativeLayout 之后添加了 Checkbox,它将在 view_container 的顶部可见。希望它对你有用。

现在您可以设置点击监听器如上所述

更新的布局文件

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singlecard_view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:attr/selectableItemBackground"
    >
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/view_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/statelist_cardview_background"  >


        <TextView
            android:id="@+id/cardType1"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_marginLeft="30dp"
            android:layout_marginStart="30dp"
            android:layout_alignParentTop="true"
            android:paddingStart="3dp"
            android:paddingLeft="3dp"
            android:paddingEnd="6dp"
            android:paddingRight="6dp"
            android:layout_marginTop="4dp"
            android:gravity="center"
            android:textColor="#ffffff"
            android:textStyle="bold|italic"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankText1"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/cardType1"
            android:layout_toEndOf="@+id/cardType1"
            android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
            android:layout_toStartOf="@+id/cardBlankTextNumstotal"
            android:layout_marginTop="4dp"
            android:gravity="center_vertical|end"
            android:text="#"
            android:textColor="@color/colorFlLabelFinal"
            android:textStyle="bold"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankTextNumstotal"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:gravity="center"
            android:text="actual card #"
            android:layout_marginTop="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginEnd="4dp"
            android:freezesText="true"
            android:textColor="@android:color/black"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Subhead"  />

        <TextView
            android:id="@+id/cardBlankText2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="34dp"
            android:layout_marginLeft="6dp"
            android:layout_marginStart="6dp"
            android:text="todo"
            android:textColor="@android:color/black"
            android:textStyle="bold"
            android:background="@drawable/todo_underline"
            android:maxLines="1"
            style="@style/Base.TextAppearance.AppCompat.Headline"  />

        ...
    </RelativeLayout>
        <CheckBox
            android:id="@+id/chkSelected"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginTop="4dp"
            android:gravity="center"  />

    </FrameLayout>


</android.support.v7.widget.CardView>

【讨论】:

  • 好的,你是说将点击和长点击监听器放在布局文件的“LinearLayout”中的 id:“view_container”上?
  • 太好了,我会试试的。我想将 CheckBox 锚定到 CardView 的左上角,所以我是否正确地假设我需要为此使用 RelativeLayout?但是,我如何使用 RelativeLayout 将其余的 TextViews 放在 CheckBox 的右侧?我将使用列表项的布局更新问题。
  • 更新样例布局,需要使用android:layout_toRightOf
  • 好的,对于 CheckBox 下方的所有 TextView,只需设置另一个 LinearLayout 并使用“android:layout_below”?如果是这样,在该 LinearLayout 中为 TextView 嵌套一个 RelativeLayout 是否会影响性能?
  • 我也有直接位于 CheckBox 下方的 TextView,因此作为“android:layout_toRightOf”CheckBox 的 LinearLayout 将不允许我让 view_container 覆盖 CardView 的整个区域(不包括 CheckBox 区域)。我需要以某种方式设置 view_container 布局以覆盖 CheckBox 右侧的区域和 CheckBox 下方的区域。关于如何实现的任何想法?
【解决方案3】:

试试这个

public class MyRecylerAdapter extends RecyclerView.Adapter<MyRecylerAdapter.ItemHolder> {

...

    public MyRecylerAdapter(Context context, ArrayList<ListItem> listItems,
                            ArrayList<ListItem> selectedList) {
        this.mContext = context;
        this.mListItems = listItems;
        this.selectedItemsList = selectedList;
    }

    private int selectedPos = -1;

    public class ItemHolder extends RecyclerView.ViewHolder {

        private CardView cardView;
        private CheckBox chkSelected;

        private ItemHolder(final View itemView) {
            super(itemView);

            cardView = (CardView) itemView.findViewById(R.id.singlecard_view1);
            chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
        }

        void bind(int position) {

            if (checkedListItems.contains(position)) {
                chkSelected.setChecked(true);
            } else {
                chkSelected.setChecked(false);
            }
        }
    }

    @Override
    public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
        final ItemHolder itemHolder = new ItemHolder(view);

        return itemHolder;
    }

    public void onBindViewHolder(final ItemHolder itemHolder, final int position) {

        final ListItem listItem = mListItems.get(position);

        itemHolder.bind(position);

        if (checkedListItems.contains(position)) {
            itemHolder.cardView.setActivated(true);
        } else {
            itemHolder.cardView.setActivated(false);
        }

        if (itemHolder.getAdapterPosition() == selectedPos) {
            itemHolder.cardView.setActivated(true);
        } else {
            itemHolder.cardView.setActivated(false);
        }

        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            // Handles the row being clicked.
            @Override
            public void onClick(View view) {

                if (recyclerItemClickListener != null) {
                     recyclerItemClickListener.onItemClick(itemHolder.itemView, listItem);
               }
           }
       });

       itemHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
           @Override
           public boolean onLongClick(View view) {

               if (recyclerItemClickListener != null) {
                   recyclerItemClickListener.onItemLongClick(itemHolder.itemView, listItem);
               }

               int adapterPos2 = itemHolder.getAdapterPosition();
               if (adapterPos2 != android.support.v7.widget.RecyclerView.NO_POSITION) {
                   int lastSelectedPosition = selectedPos;
                   selectedPos = adapterPos2;
                   notifyItemChanged(lastSelectedPosition);
                   notifyItemChanged(selectedPos);
               }
               return true;
           }
       });

       itemHolder.chkSelected.setOnClickListener(new View.OnClickListener() {
        @Override
           public void onClick(View v) {

               if (position == android.support.v7.widget.RecyclerView.NO_POSITION) return;
               if (recyclerItemClickListener != null) {
                   recyclerItemClickListener.onCheckBoxClick(v, position);
               }
               Integer iPos = position;

               if (((CheckBox) v).isChecked()) {
                   checkedListItems.add(iPos);
               } else {
                   checkedListItems.remove(iPos);
               }
           }
       });
   }

   @Override
   public int getItemCount() {
      return mListItems.size();
   }
}

【讨论】:

  • 我想到了像你这样的解决方案,但我想避免将点击侦听器放在 onBindViewHolder() 方法中。因为它们在该方法中被重新创建了很多次,这可能会损害性能。
  • 确切的事情会发生在您的代码中,因为每次调用方法onBindViewHolder() 都会有一个新对象ItemHolder,因此最好在onBindViewHolder() 中管理所有点击事件你的情况
  • 啊,好点子。但这引出了一个问题,我想知道是否应该或可以更改 ItemHolder 代码,以便每次都不会在 onBindViewHolder 中创建新对象。有什么想法吗?
  • 如果你想使用相同的代码,然后在bind() 中管理整个数据集,并在ItemHolder 中由switch-case 处理你的onClick(),比如你得到哪个元素点击事件
  • 从onBindViewHolder()中移除点击事件,只在ItemHolder进行管理
【解决方案4】:

如果我正确理解了您的问题,请尝试此代码,如果它不起作用,请告诉我

适配器 Java 代码

public class Adapter extends RecyclerView.Adapter<Adapter.ItemHolder> {

    private ArrayList<DemoData> mDemoData;

    public Adapter() {
        mDemoData = new ArrayList<>();
        for (int i = 0; i <= 100; i++) {
            mDemoData.add(new DemoData("Item " + i, false));
        }
    }

    @Override
    public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyler_card, parent, false));
    }

    @Override
    public void onBindViewHolder(ItemHolder holder, int position) {

        //Check if the item is check and toggle the checkbox
        if (mDemoData.get(position).checked) {
            holder.mCheckBox.setChecked(true);
        } else {
            holder.mCheckBox.setChecked(false);
        }

        //Set text to the textview
        holder.mTextView.setText(mDemoData.get(position).item);

    }

    @Override
    public int getItemCount() {
        return mDemoData.size();
    }

    public class ItemHolder extends RecyclerView.ViewHolder {
        private TextView mTextView;
        private CheckBox mCheckBox;

        public ItemHolder(View itemView) {
            super(itemView);
            mTextView = (TextView) itemView.findViewById(R.id.textView);
            mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);

            //set OnClickListener 
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mCheckBox.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
                }
            });

            //set OnLongClickListener
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    //if handled return true if not return false;
                    Toast.makeText(mCheckBox.getContext(), "Long Clicked", Toast.LENGTH_SHORT).show();
                    return false;
                }
            });

            mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    mDemoData.get(getAdapterPosition()).checked = isChecked;
                }
            });
        }
    }
}

ItemView XML 代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="75dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="75dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <CheckBox
            android:id="@+id/checkbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.v7.widget.CardView>

活动 Java 代码

public class RecyclerDemoActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_demo);
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        mRecyclerView.setAdapter(new Adapter());
    }
}

只需使用此演示并相应地更改您的代码。

编辑: 这是使用的模型类。

 public class DemoData{
    public String item;
    public boolean checked;
    public DemoData(String item,boolean isChecked){
    this.item=item;
    this.checked=isChecked;
    }
    }

|REY|

【讨论】:

  • 您好,您推荐的“.checked”代码是什么?我试图找到它的定义是什么 ArrayList 和 setOnCheckedChangeListener.
  • 抱歉忘了提到模型类检查编辑。
  • 您好,我想避免在模型类中添加“isChecked”。
  • 你为什么要避免任何特定的原因?
【解决方案5】:

你应该给你 data(mListItems) 添加一个 isChecked Fileds!你可以这样做

holder.checkebox.setchecked(false);
if(mListItems.get(position).ischekced){
 holder.checkebox.setchecked(true);
}
holder.checkebox..setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
  mListItems.get(position).isChecked=isChecked;

}
});

【讨论】:

  • 谢谢,我尽量避免将“isChecked”放在模型类中。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2016-12-06
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多