2012-07-01 38 views
19

我想創建一個Activity,其中包含一個列表,其中行具有自定義佈局。 所以我創建了list_entry_layout.xml文件中定義的佈局,我的列表中的每一行必須(在我的例子每一行應該有一個標題和摘要):帶有自定義行佈局的ListView - Android

<?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/list_entry_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20dp" > 
    </TextView> 

    <TextView 
     android:id="@+id/list_entry_summary" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="10dp" > 
    </TextView> 

</LinearLayout> 

我的問題是,我不知道如何將數據添加到ListActivity類中的每一行。 隨着下面的代碼片段,我可以添加每一行的標題:

public class MyActivity extends ListActivity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_activity); 

     ListView listView = (ListView) findViewById(android.R.id.list); 
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
      "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
      "Linux", "OS/2" }; 

     ArrayAdapter<String> titleAdapter = new ArrayAdapter<String>(this, R.layout.list_entry_layout, R.id.list_entry_title, values); 
     // Assign adapter to ListView 
     listView.setAdapter(titleAdapter); 

    } 
} 

對於還加入了總結,我應該怎麼辦?

如果我添加此代碼,我會有摘要可視化,而不是標題:

String[] values = new String[] { "Android_summary", "iPhone_summary", "WindowsMobile_summary", "Blackberry_summary", "WebOS_summary", "Ubuntu_summary", "Windows7_summary", "Max OS X_summary", "Linux_summary", "OS/2_summary" }; 
ArrayAdapter<String> summaryAdapter = new ArrayAdapter<String>(this, R.layout.list_entry_layout, R.id.list_entry_summary, values); 
// Assign adapter to ListView 
listView.setAdapter(summaryAdapter); 

以下是結果,我想獲得:

enter image description here

回答

31

您需要創建自己的ArrayAdapter

private class YourAdapter extends ArrayAdapter<String> { 
    // do some work 
} 

那麼你應該指定如何看你的行與XML,正是爲了自己的目標,我建議您使用RelativeLayout的,它可以是這樣的:

行。XML

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

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     /> 

    <TextView 
     android:id="@+id/email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@id/name" 
     /> 

</RelativeLayout> 

所以後來在YourAdapter你必須設置超級constuctor:

public YourAdapter() { 
    super(YourActivity.this, R.layout.row, data); 
} 

那麼對於自定義ListView +更有效地執行我向你推薦你的數據重寫getView()方法,還可以使用Holder design pattern

@Override 
public View getView(int position, View convertView, ViewGroup parent) {   
    ViewHolder holder = null; 
    LayoutInflater inflater = getLayoutInflater(); 
     if (convertView == null) { 
     convertView = inflater.inflate(R.layout.row, null, false); 
     holder = new ViewHolder(convertView); 
     convertView.setTag(holder); 
     } 
     else { 
     holder = (ViewHolder) convertView.getTag(); 
     }  
     holder.getUpperText().setText(dataSource[position]); 
     holder.getLowerText().setText(dataSource[position]); 

    return convertView; 
} 

最後只是初始化ListView並設置Adapter

ListView list = (ListView) findViewById(R.id.list); 
list.setAdapter(new YourAdapter()); 


注:Design pattern Holder代表持有的每一行的子控件任意對象,所以你需要找到他們只有一次,然後用Holder對象,你將永遠有權訪問它們。

Holder可以實現如下:

public class ViewHolder { 
    private View row; 
    private TextView upperText = null, lowerText = null; 

    public ViewHolder(View row) { 
     this.row = row; 
    } 

    public TextView getUpperText() { 
     if (this.upperText == null) { 
     this.upperText = (TextView) inView.findViewById(R.id.someId); 
     } 
     return this.upperText; 
    } 

    public TextView getLowerText() { 
     if (this.lowerText == null) { 
     this.lowerText = (TextView) inView.findViewById(R.id.someId); 
     } 
     return this.lowerText; 
    } 
} 


希望它能幫助。

12

您可以使用android.R.layout.simple_list_item_2來實現此佈局,而不是創建自定義行佈局。

無論如何,如果你想與自定義行佈局方法,然後我有片段爲你準備好。

你在這裏。

SampleActivity.java

package org.sample; 

import java.util.ArrayList; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
import android.widget.TwoLineListItem; 

public class SampleActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Mobile mobile; 

     ArrayList<Mobile> mobiles new ArrayList<Mobile>(); 

     mobile = new Mobile(); 
     mobile.setName("Android"); 
     mobile.setSummary("summary goes here"); 
     mobiles.add(mobile); 

     mobile = new Mobile(); 
     mobile.setName("Blackberry"); 
     mobile.setSummary("summary goes here"); 
     mobiles.add(mobile); 

     setListAdapter(new MyAdapter(this, mobiles)); 
    } 

} 

Mobile.java

class Mobile { 
    String name; 
    String summary; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getSummary() { 
     return summary; 
    } 

    public void setSummary(String summary) { 
     this.summary = summary; 
    } 

} 

MyAdapter.java

class MyAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Mobile> mobiles; 

    public MyAdapter(Context context, ArrayList<Mobile> mobiles) { 
     this.context = context; 
     this.mobiles = mobiles; 
    } 

    @Override 
    public int getCount() { 
     return mobiles.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mobiles.get(position); 
    } 

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

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


     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = (View) inflater.inflate(
        R.layout.list_entry_layout, null); 
     } 

     TextView name = (TextView)convertView.findViewById(R.id.list_entry_title); 
     TextView summary=(TextView)convertView.findViewById(R.id.list_entry_summary); 

     name.setText(mobiles.get(position).getName()); 
     summary.setText(mobiles.get(position).getSummary()); 

     return convertView; 
    } 
}