具有自定义行布局的 ListView - Android [英] ListView with customized Row Layout - Android

查看:43
本文介绍了具有自定义行布局的 ListView - Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个 Activity,其中包含一个列表,其中的行具有自定义布局.因此,我创建了 list_entry_layout.xml 文件,该文件定义了列表中每一行应具有的布局(在我的示例中,每一行应具有标题和摘要):

<文本视图android:id="@+id/list_entry_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20dp" ></TextView><文本视图android:id="@+id/list_entry_summary"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="10dp" ></TextView></LinearLayout>

我的问题是我不知道如何将数据添加到 ListActivity 类中的每一行.使用以下代码片段,我可以添加每一行的标题:

公共类 MyActivity 扩展了 ListActivity{@覆盖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", "WindowsMo​​bile",黑莓"、WebOS"、Ubuntu"、Windows7"、Max OS X"、"Linux", "OS/2" };ArrayAdaptertitleAdapter = new ArrayAdapter(this, R.layout.list_entry_layout, R.id.list_entry_title, values);//将适配器分配给 ListViewlistView.setAdapter(titleAdapter);}}

<块引用>

要添加摘要我该怎么做?

如果我添加此代码,我会将摘要可视化,而不是标题:

String[] values = new String[] { "Android_summary", "iPhone_summary", "WindowsMo​​bile_summary", "Blackberry_summary", "WebOS_summary", "Ubuntu_summary", "Windows7_summary", "Max OS X_summary","Linux_summary", "OS/2_summary" };ArrayAdaptersummaryAdapter = new ArrayAdapter(this, R.layout.list_entry_layout, R.id.list_entry_summary, values);//将适配器分配给 ListViewlistView.setAdapter(summaryAdapter);

以下是我想要获得的结果:

解决方案

您需要创建自己的ArrayAdapter:

私有类 YourAdapter 扩展了 ArrayAdapter{//做一些工作}

然后,您应该指定如何使用 XML 显示您的行,完全符合您的目标,我建议您使用 RelativeLayout,它可以如下所示:

row.xml

<文本视图android:id="@+id/名称"android:layout_width="wrap_content"android:layout_height="wrap_content"机器人:layout_alignParentLeft =真"/><文本视图android:id="@+id/email"android:layout_width="wrap_content"android:layout_height="wrap_content"机器人:layout_alignParentLeft =真"android:layout_below="@id/name"/></RelativeLayout>

那么在YourAdapter中你必须设置超级构造函数:

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

然后为了在 ListView 中自定义您的数据 + 更有效的实现,我建议您覆盖 getView() 方法并使用 Holder 设计模式.

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder 持有人 = null;LayoutInflater inflater = getLayoutInflater();if (convertView == null) {convertView = inflater.inflate(R.layout.row, null, false);持有人 = 新的 ViewHolder(convertView);convertView.setTag(holder);}别的 {持有人 = (ViewHolder) convertView.getTag();}holder.getUpperText().setText(dataSource[position]);holder.getLowerText().setText(dataSource[position]);返回转换视图;}

最后只需初始化ListView并设置Adapter:

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


注意: Design pattern Holder 代表任意对象,包含每一行的子小部件,所以你只需要找到它们一次,然后用 Holder 对象,您将始终可以访问它们.

Holder 的实现可以是这样的:

公共类 ViewHolder {私人视图行;私有 TextView upperText = null,lowerText = null;公共 ViewHolder(查看行){this.row = 行;}公共 TextView getUpperText() {如果(this.upperText == null){this.upperText = (TextView) inView.findViewById(R.id.someId);}返回 this.upperText;}公共文本视图 getLowerText() {如果(this.lowerText == null){this.lowerText = (TextView) inView.findViewById(R.id.someId);}返回 this.lowerText;}}


希望对您有所帮助.

I'd like to create an Activity containing a list in which the rows have a custom layout. So I've created the list_entry_layout.xml file defining the layout that each row of my list should have (in my example each row should have a title and a summary):

<?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>

My problem is that I do not know how to add the data to each row in the ListActivity class. With the following code snippet I'm able to add the titles of each row:

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

    }
}

For adding also the summary how should I do?

If I add this code I will have the summaries visualized, and not the titles:

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

The following is the result I'd like to obtain:

解决方案

You need to create your own ArrayAdapter:

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

Then you should specify how will look your row with XML, exactly for your goal, i recommend to you use RelativeLayout and it can looks like this:

row.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>

So then in YourAdapter you have to set super constuctor:

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

Then for customize your data in ListView + more effective implementation i recommend to you override getView() method and also use 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;  
}

Finally just initialize ListView and set Adapter:

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


Note: Design pattern Holder represents arbitrary object that holds child widgets of each row, so you need to find them only once and then with Holder object you will always have access to them.

Implementation of Holder can looks like this:

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


Hope it helps.

这篇关于具有自定义行布局的 ListView - Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆