优化 ListView 适配器以在单个 ListView 项中显示动态内容
Optimizing ListView adapter to display dynamic content in individual ListView items
我正在尝试显示一个 ListView,其中各个列表项具有动态数量的元素。每个项目列表都有一个日期的 TextView。在日期之后,可以有 2-5 个特色元素。
- ListItemA
- DateTextView
- 2-5 TextView
- ListItemB
- DateTextView
- 2-5 TextView
- ListItemC
- DateTextView
- 2-5 TextView
...
使用当前的方法,它会在 ListView 的项目底部显示空白的 TextView。有更好的方法吗?
我以为convertView
会有添加布局元素的方法,但事实并非如此。
适配器的 getView 方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = this.inflater.inflate(R.layout.layout_list_item, parent, false);
holder.text_date_cashout = (TextView) convertView.findViewById(R.id.text_date_cashout);
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout1));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout2));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout3));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout4));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout5));
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
//get and set date from current cashOutHistory
CashOutHistory coh = cashOutHistory.get(position);
holder.text_date_cashout.setText(coh.getDate());
//loop individual cashOuts to display their values
int i = 0;
for (CashOut co : coh.getCashOutHistory() ){
holder.dynamic_views.get(i).setText(co.toString());
i++;
}
return convertView;
}
private class ViewHolder{
TextView text_date_cashout;
ArrayList<TextView> dynamic_views = new ArrayList<TextView>(5);
}
列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_date_cashout" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout4" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout5" />
</LinearLayout>
编辑#1
在我的列表项中循环显示和隐藏 TextView:
//loop individual cashOuts to display their values
int i = 0;
for (CashOut co : coh.getCashOutHistory() ){
holder.dynamic_views.get(i).setText(co.toString());
i++;
}
while(i < 5){
holder.dynamic_views.get(i).setVisibility(View.GONE);
i++;
}
您可以隐藏不需要为特定项目显示的每个视图,方法是:
Boolean someCondition = true;
if (someCondition)
holder.dynamic_views.get(i).setVisibility(View.GONE);
希望对您有所帮助。
我正在尝试显示一个 ListView,其中各个列表项具有动态数量的元素。每个项目列表都有一个日期的 TextView。在日期之后,可以有 2-5 个特色元素。
- ListItemA
- DateTextView
- 2-5 TextView
- ListItemB
- DateTextView
- 2-5 TextView
- ListItemC
- DateTextView
- 2-5 TextView
...
使用当前的方法,它会在 ListView 的项目底部显示空白的 TextView。有更好的方法吗?
我以为convertView
会有添加布局元素的方法,但事实并非如此。
适配器的 getView 方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = this.inflater.inflate(R.layout.layout_list_item, parent, false);
holder.text_date_cashout = (TextView) convertView.findViewById(R.id.text_date_cashout);
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout1));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout2));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout3));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout4));
holder.dynamic_views.add((TextView) convertView.findViewById(R.id.text_cashout5));
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
//get and set date from current cashOutHistory
CashOutHistory coh = cashOutHistory.get(position);
holder.text_date_cashout.setText(coh.getDate());
//loop individual cashOuts to display their values
int i = 0;
for (CashOut co : coh.getCashOutHistory() ){
holder.dynamic_views.get(i).setText(co.toString());
i++;
}
return convertView;
}
private class ViewHolder{
TextView text_date_cashout;
ArrayList<TextView> dynamic_views = new ArrayList<TextView>(5);
}
列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_date_cashout" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout4" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/text_cashout5" />
</LinearLayout>
编辑#1
在我的列表项中循环显示和隐藏 TextView:
//loop individual cashOuts to display their values
int i = 0;
for (CashOut co : coh.getCashOutHistory() ){
holder.dynamic_views.get(i).setText(co.toString());
i++;
}
while(i < 5){
holder.dynamic_views.get(i).setVisibility(View.GONE);
i++;
}
您可以隐藏不需要为特定项目显示的每个视图,方法是:
Boolean someCondition = true;
if (someCondition)
holder.dynamic_views.get(i).setVisibility(View.GONE);
希望对您有所帮助。