Using multiple string resources for different textviews
Hey, I'm currently having trouble with a small Android application I'm making. What I'm attempting to build is:
- A list interface with
- Each row having two TextViews (a title and a caption).
- Have the values of these to be drawn from two separate string array resources.
The interface has the following text views in 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>
and the string resources are,
<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>
There should be two rows titled Start and Stop and each has their relevant captions. I've attempted using an ArrayAdapter
to implement this,
ArrayAdapter listAdapter = ArrayAdapter.createFromResource(this,
new int[] {R.array.menuEntryTitles, R.array.menuEntryCaptions},
开发者_JS百科 new int[] {R.id.rowTitle, R.id.rowCaption});
but I'm getting errors due to createFromResource
requiring int
arguments when I can only provide int[]
.
Hope someone here can point me in the right direction.
Cheers
One solution is to create your own adapter since ArrayAdapter only uses one array, and not two.
You can create the adapter as a private class within you ListActivity. Try something like this (warning: code not tested):
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;
}
}
}
精彩评论