为不同的文本视图使用多个字符串资源

时间:2011-05-25 15:25:56

标签: android android-layout android-listview textview

嘿,我目前正在使用我正在制作的小型Android应用程序。我正在尝试建立的是:

  • 列表界面
    • 每行有两个TextView(标题和标题)。
    • 从两个单独的字符串数组资源中获取这些值。

界面在rowLayout.xml

中包含以下文本视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" android:orientation="vertical">

<TextView android:text="@+id/rowTitle"
          android:layout_height="wrap_content"
          android:id="@+id/title"
          android:textSize="25px"
          android:layout_width="match_parent">
</TextView>

<TextView android:text="@+id/rowCaption"
          android:layout_height="wrap_content"
          android:id="@+id/caption"
          android:textSize="25px"
          android:layout_width="match_parent">
</TextView>

和字符串资源是,

<string-array name="menuEntryTitles">
    <item>Start</item>
    <item>Stop</item>
</string-array>

<string-array name="menuEntryCaptions">
    <item>Starts the update listener service.</item>
    <item>Stops the update listener service.</item>
</string-array>

应该有两行标题为“开始”和“停止”,每行都有相关的标题。我尝试使用ArrayAdapter来实现此目的,

ArrayAdapter listAdapter = ArrayAdapter.createFromResource(this,
             new int[] {R.array.menuEntryTitles, R.array.menuEntryCaptions},
             new int[] {R.id.rowTitle, R.id.rowCaption});

但由于createFromResource需要int参数,我才会收到错误,因为我只能提供int[]

希望有人能指出我正确的方向。

干杯

1 个答案:

答案 0 :(得分:1)

一种解决方案是创建自己的适配器,因为ArrayAdapter只使用一个数组,而不是两个。

您可以在ListActivity中将适配器创建为私有类。尝试这样的事情(警告:未经测试的代码):

public class MyListActivity extends ListActivity {
    protected void onCreate(){

        ....

        // Get arrays from resources
        Resources r = getResources();    
        String [] arr1 = r.getStringArray("menuEntryTitles");
        String [] arr1 = r.getStringArray("menuEntryCaptions");

        // Create your adapter
        MyAdapter adapter = new MyAdapter(arr1, arr2);

        setListAdapter(adapter);
    }

    private class MyAdapter extends BaseAdapter {
        private LayoutInflater inflater;

        String [] arr1;
        String [] arr2;

        public MyAdapter(String[] arr1, String[] arr2){
            inflater = (LayoutInflater)MyListActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            this.arr1 = arr1;
            this.arr2 = arr2;
        }

        @Override
        public int getCount() {
            return arr1.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

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

        // Used to keep references to your views, optimizes scrolling in list
        private static class ViewHolder {
             TextView tv1;
             TextView tv2;
        }


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

            ViewHolder holder;
            if (convertView == null){
                convertView = inflater.inflate(R.layout.row_layout, null);

                // Creates a ViewHolder and store references to the two children views
                // we want to bind data to.
                holder = new ViewHolder();
                holder.tv1 = (TextView) convertView.findViewById(R.id.rowTitle);
                holder.tv2 = (TextView) convertView.findViewById(R.id.rowCaption);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }

            holder.tv1.setText(arr1[position]);
            holder.tv2.setText(arr2[position]);

            return convertView;
        }
    }
}