Java 如何为android中不在recyclerview中的单个cardview元素添加onClick事件?
我正在使用一个包含cardview列表的应用程序,我希望每个cardview在点击时打开特定的活动。我没有使用任何recyclerviews或适配器,我只是创建了多个cardview xml文件,并将它们包含在coordinatorlayout和CollasingToolbarLayout中的主xml中。我曾尝试为单个CardView创建onClick事件,但应用程序不断崩溃。 以下是我的main.xml代码:Java 如何为android中不在recyclerview中的单个cardview元素添加onClick事件?,java,android,xml,Java,Android,Xml,我正在使用一个包含cardview列表的应用程序,我希望每个cardview在点击时打开特定的活动。我没有使用任何recyclerviews或适配器,我只是创建了多个cardview xml文件,并将它们包含在coordinatorlayout和CollasingToolbarLayout中的主xml中。我曾尝试为单个CardView创建onClick事件,但应用程序不断崩溃。 以下是我的main.xml代码: <android.support.design.widget.AppBarLa
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="250dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
android:background="@drawable/pic3"
android:id="@+id/profile_id"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="10dp">
<include layout="@layout/card_layout1" />
<include layout="@layout/card_layout6"/>
<include layout="@layout/card_layout4"/>
<include layout="@layout/card_layout5"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
}
如何在不使用recyclerview和适配器的情况下为每个CardView实现onClick事件?这是一种糟糕的做法。但您可以将标记设置为所有卡片视图,在代码中找到它们并设置click listener: 在main.xml中
...
<LinearLayout
android:id="@+id/cardsContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="10dp">
<include layout="@layout/card_layout1" />
<include layout="@layout/card_layout6"/>
<include layout="@layout/card_layout4"/>
<include layout="@layout/card_layout5"/>
</LinearLayout>
...
。。。
...
所有卡片布局必须有标签:
<android.support.v7.widget.CardView
android:tag="clickableCard"
...>
...
</android.support.v7.widget.CardView>
)
private ArrayList getViewsByTag(视图组根,字符串标记){
ArrayList视图=新建ArrayList();
final int childCount=root.getChildCount();
for(int i=0;i
}
在onCreate方法末尾的MainActivity.java中,您需要:
ArrayList<View> clickableViews = getViewsByTag(findViewById(R.id.cardsContainer), "clickableCard");
for (int i = 0; i < clickableViews.size(); i++) {
final Integer viewIndex = i;
View cardView = clickableViews.get(i);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewIndex == 0) {
// do work with first card
}
else if (viewIndex == 1) {
// do work with second card
}
...
}
});
}
ArrayList clickableViews=getViewsByTag(findViewById(R.id.cardsContainer),“clickableCard”);
对于(int i=0;i
谢谢!工作起来很有魅力!事实上,我必须在最后期限前完成,学习recyclerview占用了我太多的时间,所以我决定采用老式的方式。无论如何,非常感谢你!谢谢)请给我的答案打分,这是我关于stackoverflow的第一个答案:)
<android.support.v7.widget.CardView
android:tag="clickableCard"
...>
...
</android.support.v7.widget.CardView>
private ArrayList<View> getViewsByTag(ViewGroup root, String tag){
ArrayList<View> views = new ArrayList<View>();
final int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = root.getChildAt(i);
if (child instanceof ViewGroup) {
views.addAll(getViewsByTag((ViewGroup) child, tag));
}
final Object tagObj = child.getTag();
if (tagObj != null && tagObj.equals(tag)) {
views.add(child);
}
}
return views;
ArrayList<View> clickableViews = getViewsByTag(findViewById(R.id.cardsContainer), "clickableCard");
for (int i = 0; i < clickableViews.size(); i++) {
final Integer viewIndex = i;
View cardView = clickableViews.get(i);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewIndex == 0) {
// do work with first card
}
else if (viewIndex == 1) {
// do work with second card
}
...
}
});
}