Использование нескольких строковых ресурсов для разных текстовых представлений - PullRequest
1 голос
/ 25 мая 2011

Эй, у меня проблемы с небольшим Android-приложением, которое я создаю.Я пытаюсь построить:

  • Интерфейс списка с
    • Каждая строка имеет два TextViews (заголовок и заголовок).
    • Имеют значенияиз них можно извлечь из двух отдельных ресурсов строкового массива.

Интерфейс имеет следующие текстовые представления в 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>

Должны быть две строки с названиями Start и Stop, и у каждой есть соответствующие заголовки.Я пытался использовать 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 Ответ

1 голос
/ 25 мая 2011

Одним из решений является создание собственного адаптера, поскольку 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;
        }
    }
}
...