我尝试用ListView
创建一个CardView
。 CardView
总是包含3行信息,但之后得到2n行,如下所示:
-职位,姓名;
-图片,数据,图片,数据。
我正在使用此任务对象,其中包含:
-带有数据的对象,该对象将始终占据第3行;
-我用于2n行的对象列表。
我已经尝试过:
-将RecyclerAdapter
换成ArrayAdapter
(有助于我更改可见性,但不会夸大);
-创建一种方法,该方法将处理与放大该布局有关的所有逻辑
-在onBindViewHolder/getView
我将通过另一种方法粘贴带有CardView
的版本:
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
/*inflating layout and fill it with data from first object*/
View listItem = convertView;
if(listItem == null)
listItem = LayoutInflater.from(context).inflate(R.layout.card,parent,false);
//add data
//if needed to make sure that inflating will occur once. list is
//LinearLayout inside CardView, current is entire object
if(list.getChildCount() < 1)
addList(list, current);
//setting click listeners and returning view
}
private void addList(ViewGroup parent, ListItem current){
for (Item var : ListItem.getItemList()) {
View layout = LayoutInflater.from(context).inflate(R.layout.card_part, parent, false);
//setting data
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
params.width = LinearLayout.LayoutParams.WRAP_CONTENT;
layout.setLayoutParams(params);
parent.addView(layout);
}
}
@EDIT:CardView
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/colorPrimary"
android:layout_margin="15dp"
app:cardCornerRadius="5dp"
app:cardElevation="25dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/id"
android:visibility="gone"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/text"
android:id="@+id/name"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/text"
android:id="@+id/type"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="@color/text"
android:layout_weight="1"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_expand"
tools:ignore="ContentDescription"
android:id="@+id/show_list"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_hide"
tools:ignore="ContentDescription"
android:visibility="gone"
android:id="@+id/hide_list"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/list"
android:visibility="gone">
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
实际结果:
-如果我发表评论
if(list.getChildCount() < 1)
有时不仅仅从正确的对象中添加数据填充时间很少。
-现在if
版式会因错误的数据而膨胀。
预期结果:
在CardView
内部膨胀会添加对对象正确的数据,并连接到对象列表。
@ EDIT2:
我尝试仅手动创建View
的一部分,而不使用LayoutInflater
。那不会改变任何东西。
答案 0 :(得分:0)
在脱离本主题后,我找到了解决方法。适配器重用View
/ getView
上的旧onBindViewHolder
。如果在添加新元素之前未清除包含其他元素(如Linear Layout
,TextView
等)的较早列表的ImageView
,则旧的将保留。
解决方法是删除旧的。在Linear Layout
上,我需要先调用removeAllViews()
,然后再添加新元素。