开发者

ListView customization

开发者 https://www.devze.com 2023-02-07 06:53 出处:网络
I have a list with RSS feed. If I write this: List<String> titles = new ArrayList<String>(messa开发者_StackOverflowges.size());

I have a list with RSS feed. If I write this:

List<String> titles = new ArrayList<String>(messa开发者_StackOverflowges.size());
        for (Message msg : messages){
            titles.add(msg.getDate());
            titles.add(msg.getTitle());

I get the title and the date in separate strings.

I tried to change it to:

titles.add(msg.getDate()+msg.getTitle());

but this returns date and titles with no space.

I would like to have date and below it the title, something like:

Thu 27 Jan 2011
Bla bla bla..

How could I do it? Also, may I have another text color or size in the date and other in the title?


An alternative approach, although a little more complex, is to use a layout xml file to specify the layout of the row and an adapter to bind each specific piece of info of each message (like the date and title) to a specific widget in the row layout.

The reason this may be better is that this way is that:

  • the layout info (stacking date over the message) stays in the XML and out of the code
  • it also makes it easier to use more complex layouts in the future (how about showing the author too? categories?),
  • it makes it easier to modify the layout in the future. and
  • it allows you to use more complex widgets and widget features, like specifying a scrolling marque text view for when descriptions are long

This example uses SimpleAdapter to bind a List of Mapped data to the complex rows of a ListView.

http://www.vbsteven.be/blog/using-the-simpleadapter-with-a-listview-in-android/

// get messages from service
ArrayList smsMessages = service.getSmsCalls();

// initialize the List of Maps
List<map> list = new ArrayList<map>();

// iterate over all messages
// create a map for each message
// fill the map with data
for (Call c: smsMessages) {
    Map map = new HashMap();
    map.put("number", c.getTo());
    map.put("date", DateParser.getTimeString(c.getBegin()));
    map.put("price", "€ " + c.getPrice());
    list.add(map);
}

// the from array specifies which keys from the map
// we want to view in our ListView
String[] from = {"number", "date", "price"};

// the to array specifies the TextViews from the xml layout
// on which we want to display the values defined in the from array
int[] to = {R.id.callog_detail_sms_number, R.id.callog_detail_sms_date, R.id.callog_detail_sms_price};

// get a reference to the ListView
ListView lv = (ListView)findViewById(R.id.callog_detail_listview);

// create the adapter and assign it to the listview
SimpleAdapter adapter = new SimpleAdapter(this.getApplicationContext(), list, R.layout.callog_detail_sms, from, to);
lv.setAdapter(adapter);

Unfortunately, the article doesn't show the layout xml, but its going to be similar to the next example below. If you really only have 2 fields, a LinearLayout is fine. More than 2 in a more complex layout, start looking at RelativeLayout:

http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"

    android:padding="6dip">

    <ImageView
        android:id="@+id/icon"

        android:layout_width="wrap_content"
        android:layout_height="fill_parent"

        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"

        android:src="@drawable/icon" />

    <TextView  
        android:id="@+id/secondLine"

        android:layout_width="fill_parent"
        android:layout_height="26dip" 

        android:layout_toRightOf="@id/icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"

        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

        android:layout_toRightOf="@id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/secondLine"
        android:layout_alignWithParentIfMissing="true"

        android:gravity="center_vertical"
        android:text="My Application" />

</RelativeLayout>


titles.add(msg.getDate()+" "+msg.getTitle());

... or, if you want to have an ENTER between those two... you will have to wrap it in a HTML string:

titles.add(msg.getDate()+"<br/>"+msg.getTitle());
// and somewhere else, when you are going to draw it:
textView.setText(Html.fromHtml(title.get(position)));
0

精彩评论

暂无评论...
验证码 换一张
取 消