如何在同一个ListView中拥有3种不同的行设计?

时间:2014-11-28 12:16:05

标签: java android xml eclipse listview

我有自定义ListView,包含60个项目,我有3个不同的行设计,3行包含相同的textView,但这里有不同的背景是更好地理解它的xmle代码:

<TextView
android:id="@+id/abilityBlue" 
android:layout_width="150dp"
android:layout_height="25dp"
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_width="150dp"
android:layout_height="25dp"
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_width="150dp"
android:layout_height="25dp"
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;
}
}

2 个答案:

答案 0 :(得分:1)

只需使用一个TextView作为自定义行。

类似的东西:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ability" 
    android:layout_width="150dp"
    android:layout_height="25dp"
    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()方法中),如果索引是&gt; 40 (41+)然后将其背景资源设置为黄色; 其他,如果,则&gt; 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 [位置]);

将其更改为:

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);
    }
}

答案 1 :(得分:0)

这是一个完整的例子

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_width="match_parent" android:layout_height="match_parent">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    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_width="match_parent"
android:layout_height="match_parent" 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_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/listView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />
</RelativeLayout>

CustomAdapter

package com.example.nayraahmed.stackoverflow;

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;
}
}

希望它能帮助