如何在同一个 ListView 中有 3 种不同的行设计?
Posted
技术标签:
【中文标题】如何在同一个 ListView 中有 3 种不同的行设计?【英文标题】:how to have 3 different row designs in the same ListView? 【发布时间】:2015-01-27 02:26:55 【问题描述】:我有包含 60 个项目的自定义 ListView,我有 3 个不同的行设计,3 行包含相同的 textView,但背景不同,这里是 xmle 代码以更好地理解它:
<TextView
android:id="@+id/abilityBlue"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:paddingLeft="23dp"
android:paddingRight="1dp"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:background="@drawable/ability_blue_btn"/>
<TextView
android:id="@+id/abilityGreen"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:paddingLeft="23dp"
android:paddingRight="1dp"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:background="@drawable/ability_green_btn"/>
<TextView
android:id="@+id/abilityYellow"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:paddingLeft="23dp"
android:paddingRight="1dp"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:background="@drawable/ability_yellow_btn"/>
所以我想知道如何使用不同的 textview 制作每 20 个项目的示例。 谢谢
我的适配器:
class Ability extends ArrayAdapter<String>
Context context;
String[] titleArray;
Ability(Context c,String[] Names)
super(c,R.layout.ability_btn,R.id.abilityBlue,Names);
this.context=c;
this.titleArray=Names;
class MyViewHolder
TextView myText;
MyViewHolder(View v)
myText = (TextView) v.findViewById(R.id.abilityBlue);
@Override
public View getView(int position, View convertView, ViewGroup parent)
// TODO Auto-generated method stub
View row = convertView;
MyViewHolder holder = null;
if(row==null)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.ability_btn, parent, false);
holder = new MyViewHolder(row);
row.setTag(holder);
else
holder = (MyViewHolder) row.getTag();
holder.myText.setText(titleArray[position]);
return row;
【问题讨论】:
使用单个 TextView 作为您的自定义行。然后,在适配器中,如果索引为> 40(41+)则将其背景资源设置为黄色; 否则,如果是> 20 (21+),则将其背景资源设置为绿色。否则(1 - 20)不要改变它(蓝色)。很容易。只是一个if ... elseif
@DerGolem 你能告诉我如何在更详细的答案中做到这一点,请:)
与 Lollipop 一起发布的 RecyclerView 会是更好的选择。
当视图被回收时,您必须始终设置颜色。
【参考方案1】:
只需使用单个 TextView 作为您的自定义行。
类似:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ability"
android:layout_
android:layout_
android:layout_gravity="center"
android:gravity="left|center_vertical"
android:paddingLeft="23dp"
android:paddingRight="1dp"
android:textSize="12sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:background="@drawable/ability_blue_btn"
/>
然后,在适配器中(在getView()
方法中),如果索引是> 40(41+)然后设置其背景资源为黄色; 否则,如果是> 20 (21+),则将其背景资源设置为绿色。
否则 (1 - 20) 不要更改它(蓝色)。
类似这样的:
final TextView txtAbility = (TextView) v.findViewById(R.id.ability);
// Change the item color
// This one is based on the TextView's text value, since mine was a game score.
// You can change the int ability to match the item position.
final int ability = Integer.parseInt((String) txtAbility.getText());
if (ability > 40)
txtAbility.setBackgroundResource(R.drawable.ability_yellow_btn);
else
if (ability > 20)
txtAbility.setBackgroundResource(R.drawable.ability_green_btn);
很容易。只是一个if ... elseif
[编辑]
您的代码:
holder.myText.setText(titleArray[position]);
改成:
holder.myText.setText(titleArray[position]); // same as yours, just add the lines below.
// Change the item color
if (position > 39) // position starts at 0
holder.myText.setBackgroundResource(R.drawable.ability_yellow_btn);
else
if (position > 19) // position starts at 0
holder.myText.setBackgroundResource(R.drawable.ability_green_btn);
【讨论】:
在哪里添加第二部分代码在 OnCreate 或适配器中 在适配器中,我提到了这一点。 很抱歉我知道这个问题真的很愚蠢,但是getView方法中的适配器在哪里或者到底在哪里 我不知道如何将它添加到我的适配器中,所以我编辑了我的问题并输入了我的适配器,请告诉我如何将它添加到我的适配器中 好的,它工作正常,但是当我向下滚动时,我上去背景变化,它们变得随机【参考方案2】:这是一个完整的例子
public class MainActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.listView);
ArrayList<String> arr = new ArrayList<String>();
for (int i = 0 ; i<60; i++)
arr.add("test"+String.valueOf(i));
CustomAdapter adapter = new CustomAdapter(this , R.layout.activity_main , arr);
lv.setAdapter(adapter);
custom_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_>
<TextView
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/tvtextView" />
</LinearLayout>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_
android:layout_ android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<ListView
android:layout_
android:layout_
android:id="@+id/listView"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
自定义适配器
package com.example.nayraahmed.***;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class CustomAdapter extends ArrayAdapter<String>
ArrayList<String> Info;
private Context context;
CustomAdapter(Context context, int resource, ArrayList<String> objects)
super(context, resource, objects);
// TODO Auto-generated constructor stub
this.context = context;
Info = objects;
@Override
public View getView(int position, View convertView, ViewGroup parent)
// TODO Auto-generated method stub
EventItemHolder eventHolder;
View view = convertView;
if (view == null)
eventHolder = new EventItemHolder();
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
view = inflater.inflate(R.layout.custom_row, parent, false);
eventHolder.title = (TextView) view.findViewById(R.id.tvtextView);
view.setTag(eventHolder);
else
eventHolder = (EventItemHolder) view.getTag();
String eItem = (String) this.Info.get(position);
if(position < 20)
eventHolder.title.setBackgroundColor(Color.RED);
else if(position>=20 && position<40)
eventHolder.title.setBackgroundColor(Color.BLUE);
else
eventHolder.title.setBackgroundColor(Color.GREEN);
eventHolder.title.setText(eItem);
return view;
private static class EventItemHolder
TextView title;
希望对你有帮助
【讨论】:
它工作不正常,蓝色背景不再存在,只有绿色和黄色,在 wach textview 之后有 2 个额外的空 textview 一个带有绿色背景,一个带有黄色背景,如果我滚动到底部应用程序停止响应 我已经测试了代码,它是正确的。你有修改过吗?? 我只是将 setBackgroundColor 更改为 setBackgroundRecources(R.drawable.ability_green_btn) 因为不同之处不仅在于颜色 我已经编辑了customAdapter类的代码,试试看。我希望它对你有用 您在列表视图中填充的项目数是多少?如果它们少于 60 个项目,则代码将无法正常工作以上是关于如何在同一个 ListView 中有 3 种不同的行设计?的主要内容,如果未能解决你的问题,请参考以下文章
android在listView的item中有一个ImageView,如何让每一个item中的ImageView显示不同的图片
android listView,list中有多个值,页面显示两个listView,如何让list中的值在页面中循环显示,谢谢大神…