如何在同一个 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显示不同的图片

如何根据先前活动中的操作填充 ListView?

android listView,list中有多个值,页面显示两个listView,如何让list中的值在页面中循环显示,谢谢大神…

如何将listview项目链接到android中的不同活动?

如何使用ListView

单个 ListView 中的不同对象