用于 ListView 的 Android 自定义行项

我有一个 ListView,它的行中应该有以下布局:

HEADER
Text

HEADER应该是静态的,但是 Text每隔几秒钟就会变化一次。

我通过填充一个 String[] array来实现它,将它传递给一个 ArrayAdapter,并在每次数据发生变化时设置它:

data_array = populateString();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1,  data_array);
listView.setAdapter(adapter);

我的问题是,我不知道如何显示上述格式的数据。

先谢谢你。

140668 次浏览

您可以按照 BaseAdapter并创建您的自定义 Xml文件,并将其与您的 BaseAdpter绑定并填充 Listview 看这里需要更改 xml文件作为需要。

将 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"
android:orientation="vertical" >
    

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Header"/>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text"/>
    

    

</LinearLayout>

使您的主 xml 布局如下所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >


<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>


</LinearLayout>

这是你的适配器

class yourAdapter extends BaseAdapter {


Context context;
String[] data;
private static LayoutInflater inflater = null;


public yourAdapter(Context context, String[] data) {
// TODO Auto-generated constructor stub
this.context = context;
this.data = data;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return data.length;
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data[position]);
return vi;
}
}

你的爪哇活动

public class StackActivity extends Activity {


ListView listview;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview = (ListView) findViewById(R.id.listview);
listview.setAdapter(new yourAdapter(this, new String[] { "data1",
"data2" }));
}
}

结果

enter image description here

创建资源布局文件 list _ item. xml

<?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="wrap_content">
<TextView
android:id="@+id/header_text"
android:layout_height="0dp"
android:layout_width="fill_parent"
android:layout_weight="1"
android:text="Header"
/>
<TextView
android:id="@+id/item_text"
android:layout_height="0dp"
android:layout_width="fill_parent"
android:layout_weight="1"
android:text="dynamic text"
/>
</LinearLayout>

像这样初始化适配器

adapter = new ArrayAdapter<String>(this, R.layout.list_item,R.id.item_text,data_array);

使用自定义列表视图。

还可以通过自定义背景来自定义行的外观。 Activity _ main. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#0095FF"> //background color


<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:focusableInTouchMode="false"
android:listSelector="@android:color/transparent"
android:layout_weight="2"
android:headerDividersEnabled="false"
android:footerDividersEnabled="false"
android:dividerHeight="8dp"
android:divider="#000000"
android:cacheColorHint="#000000"
android:drawSelectorOnTop="false">
</ListView>

主要活动

在 MainActivity 中定义 popateString ()

 public class MainActivity extends Activity {


String data_array[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data_array = populateString();
ListView ll = (ListView) findViewById(R.id.list);
CustomAdapter cus = new CustomAdapter();
ll.setAdapter(cus);
}


class CustomAdapter extends BaseAdapter
{
LayoutInflater mInflater;




public CustomAdapter()
{
mInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data_array.length;//listview item count.
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder vh;
vh= new ViewHolder();


if(convertView==null )
{
convertView=mInflater.inflate(R.layout.row, parent,false);
//inflate custom layour
vh.tv2= (TextView)convertView.findViewById(R.id.textView2);


}
else
{
convertView.setTag(vh);
}
//vh.tv2.setText("Position = "+position);
vh.tv2.setText(data_array[position]);
//set text of second textview based on position


return convertView;
}


class ViewHolder
{
TextView tv1,tv2;
}


}
}

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"
android:orientation="vertical" >


<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Header" />


<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="TextView" />


</LinearLayout>

放大自定义布局。使用 用于平滑滚动的视图固定器和性能。

Http://developer.android.com/training/improving-layouts/smooth-scrolling.html

这个 http://www.youtube.com/watch?v=wdbm6wveo70是关于 android 开发者的 listview 性能的。

enter image description here

步骤1: 创建 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"
android:orientation="vertical">




<ListView
android:id="@+id/lvItems"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>

步骤2: Studnet.java

package com.scancode.acutesoft.telephonymanagerapp;




public class Student
{
String email,phone,address;


public String getEmail() {
return email;
}


public void setEmail(String email) {
this.email = email;
}


public String getPhone() {
return phone;
}


public void setPhone(String phone) {
this.phone = phone;
}


public String getAddress() {
return address;
}


public void setAddress(String address) {
this.address = address;
}
}

第三步: MainActivity.java

 package com.scancode.acutesoft.telephonymanagerapp;


import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;


import java.util.ArrayList;


public class MainActivity extends Activity  {


ListView lvItems;
ArrayList<Student> studentArrayList ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvItems = (ListView) findViewById(R.id.lvItems);
studentArrayList = new ArrayList<Student>();
dataSaving();
CustomAdapter adapter = new CustomAdapter(MainActivity.this,studentArrayList);
lvItems.setAdapter(adapter);
}


private void dataSaving() {


Student student = new Student();
student.setEmail("abc@gmail.com");
student.setPhone("1234567890");
student.setAddress("Hyderabad");
studentArrayList.add(student);




student = new Student();
student.setEmail("xyz@gmail.com");
student.setPhone("1234567890");
student.setAddress("Banglore");
studentArrayList.add(student);


student = new Student();
student.setEmail("xyz@gmail.com");
student.setPhone("1234567890");
student.setAddress("Banglore");
studentArrayList.add(student);


student = new Student();
student.setEmail("xyz@gmail.com");
student.setPhone("1234567890");
student.setAddress("Banglore");
studentArrayList.add(student);
}




}

步骤4: CustomAdapter.java

  package com.scancode.acutesoft.telephonymanagerapp;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


import java.util.ArrayList;




public class CustomAdapter extends BaseAdapter
{
ArrayList<Student> studentList;
Context mContext;




public CustomAdapter(Context context, ArrayList<Student> studentArrayList) {
this.mContext = context;
this.studentList = studentArrayList;


}


@Override
public int getCount() {
return studentList.size();
}
@Override
public Object getItem(int position) {
return position;
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {


Student student = studentList.get(position);
convertView = LayoutInflater.from(mContext).inflate(R.layout.student_row,null);


TextView tvStudEmail = (TextView) convertView.findViewById(R.id.tvStudEmail);
TextView tvStudPhone = (TextView) convertView.findViewById(R.id.tvStudPhone);
TextView tvStudAddress = (TextView) convertView.findViewById(R.id.tvStudAddress);


tvStudEmail.setText(student.getEmail());
tvStudPhone.setText(student.getPhone());
tvStudAddress.setText(student.getAddress());




return convertView;
}
}