创建自定义列表项一个ListView以编程方式在Android的 - 没有XML列表项目布局 [英] Creating a ListView with custom list items programmatically in Android - no xml list item layout
问题描述
正如我看到的previously问的问题,自定义适配器类(比方说,MyAdapter扩展ArrayAdapter),他们总是用一个充气的XML列表项的布局中。我所希望做的是完全用Java和XML没有创造一切......
//例如
的String []单词表=新的String [] {A,B,C};
的LinearLayout list_item_layout =新的LinearLayout(本);
list_item_layout.setId(5000);
TextView的listText =新的TextView(本);
listText.setId(5001);
listLayout.addView(listText);
ListView控件列表=新的ListView(本);
// ** **问题做我宣布一个纲领性.setAdapter()这样吗?
// **注意**我通过单词表在这里..
list.setAdapter(新MyAdapter(这一点,list_item_layout.getId(),listText.getId(),词表));
和然后MyAdapter ...
私有类MyAdapter扩展ArrayAdapter<字符串> {
公共MyAdapter(上下文的背景下,INT资源,INT textViewResourceId,字符串[]字符串){
超(背景下,资源,textViewResourceId,字符串);
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
视图V = convertView; //这是我通过list_item_layout?
TextView的电视=(TextView中)v.findViewById(5001);
// ** **问我传递单词表再次在这里?
tv.setText(单词表[位置]);
返回伏;
}
}
当我运行这个设备上是我收到以下错误,会出现什么情况?
10-08 23:11:19.775:E / AndroidRuntime(18276):致命异常:主要
10-08 23:11:19.775:E / AndroidRuntime(18276):android.content.res.Resources $ NotFoundException:字符串资源编号为0x0
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.content.res.Resources.getText(Resources.java:222)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.widget.TextView.setText(TextView.java:3011)
10-08 23:11:19.775:E / AndroidRuntime(18276):在com.turista.client.TuristaClientMain.onClick(TuristaClientMain.java:113)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.view.View.performClick(View.java:2538)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.view.View $ PerformClick.run(View.java:9152)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.os.Handler.handleCallback(Handler.java:587)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.os.Handler.dispatchMessage(Handler.java:92)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.os.Looper.loop(Looper.java:123)
10-08 23:11:19.775:E / AndroidRuntime(18276):在android.app.ActivityThread.main(ActivityThread.java:3691)
10-08 23:11:19.775:E / AndroidRuntime(18276):在java.lang.reflect.Method.invokeNative(本机方法)
10-08 23:11:19.775:E / AndroidRuntime(18276):在java.lang.reflect.Method.invoke(Method.java:507)
10-08 23:11:19.775:E / AndroidRuntime(18276):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:847)
10-08 23:11:19.775:E / AndroidRuntime(18276):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-08 23:11:19.775:E / AndroidRuntime(18276):在dalvik.system.NativeStart.main(本机方法)
谁能解释如何以编程方式做到这一点?
* EDITED * 2012年10月9日
好了,因为我仍然停留在这个问题上,我认为我做了一些改进,但仍然得到错误信息。改进后的code是,如下:
//词表是一个全局变量
的String []单词表=新的String [] {A,B,C};
// ..
// ..里面的onCreate ...
ListView控件列表=新的ListView(本);
list.setAdapter(新MyAdapter(这一点,R.layout.listitem,R.id.mLargeTextView,词表));
//因为一个ArrayAdapter类需要XML参数夸大,我创建了一个虚拟布局
现在MyAdapter类中。
私有类MyAdapter扩展ArrayAdapter<字符串> {
公共MyAdapter(上下文的背景下,INT资源,INT textViewResourceId,字符串[]字符串){
超(背景下,资源,textViewResourceId,字符串);
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
的LinearLayout listLayout =新的LinearLayout(Main.this);
listLayout.setLayoutParams(新的LayoutParams(wrapContent,wrapContent));
listLayout.setId(5000);
TextView的listText =新的TextView(Main.this);
listText.setId(5001);
listLayout.addView(listText);
listText.setText(单词表[位置]);
返回listLayout;
}
}
正如你所看到的,我想我必须重写getView以显示我的自定义视图所以这就是我所做的。不幸的是,我想我误会了吧。下面是错误的。
9月10号至九日:24:10.095:E / AndroidRuntime(2517):致命异常:主要
9月10日至9日:24:10.095:E / AndroidRuntime(2517):java.lang.ClassCastException:android.view.ViewGroup $的LayoutParams
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.ListView.measureScrapChild(ListView.java:1183)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.ListView.measureHeightOfChildren(ListView.java:1266)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.ListView.onMeasure(ListView.java:1175)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.View.measure(View.java:8366)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewRoot.performTraversals(ViewRoot.java:847)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.view.ViewRoot.handleMessage(ViewRoot.java:1868)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.os.Handler.dispatchMessage(Handler.java:99)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.os.Looper.loop(Looper.java:123)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在android.app.ActivityThread.main(ActivityThread.java:3691)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在java.lang.reflect.Method.invokeNative(本机方法)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在java.lang.reflect.Method.invoke(Method.java:507)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:847)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
9月10日至9日:24:10.095:E / AndroidRuntime(2517):在dalvik.system.NativeStart.main(本机方法)
的ListView
扩展 AbsListView
这又延伸适配器视图
延伸视图组。因此, ListView控件的所有子
将被添加到的ViewGroup
。因此,要设置布局参数,你可以
使用<一个href="http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html">ViewGroup.LayoutParam在设置布局参数为 listLayout
。
或者尝试 AbsListView.LayoutParams
设置布局参数为 listLayout
请尝试,让我知道,如果它的工作。
随着code是工作的罚款。
公共类MainActivity1延伸活动{
的String []单词表=新的String [] {A,B,C};
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
ListView控件列表=新的ListView(本);
list.setAdapter(新MyAdapter(这一点,词表));
的setContentView(名单);
}
私有类MyAdapter扩展ArrayAdapter&LT;字符串&GT; {
公共MyAdapter(上下文的背景下,字符串[]字符串){
超级(上下文,-1,-1,字符串);
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
的LinearLayout listLayout =新的LinearLayout(MainActivity1.this);
listLayout.setLayoutParams(新AbsListView.LayoutParams(
AbsListView.LayoutParams.WRAP_CONTENT,
AbsListView.LayoutParams.WRAP_CONTENT));
listLayout.setId(5000);
TextView的listText =新的TextView(MainActivity1.this);
listText.setId(5001);
listLayout.addView(listText);
listText.setText(super.getItem(位置));
返回listLayout;
}
}
}
但问题是,在默认情况下的Eclipse进口 ViewGroup.LayoutParams
这是与 AbsListView.LayoutParams
这就需要不兼容用于设置布局参数从 getView()
方法视图返回。
请检查并让我知道如何去..
As I have seen on previously asked questions, inside the custom adapter class (say, MyAdapter extends ArrayAdapter) they always use an inflated xml list-item layout. What I am hoping to do is create everything entirely using Java and no XML...
// for example
String[] wordlist = new String[] {a, b, c};
LinearLayout list_item_layout = new LinearLayout(this);
list_item_layout.setId(5000);
TextView listText = new TextView(this);
listText.setId(5001);
listLayout.addView(listText);
ListView list = new ListView(this);
// ** QUESTION ** do I declare a programmatic .setAdapter() like this?
// ** TAKE NOTE ** I passed 'wordlist' here..
list.setAdapter(new MyAdapter(this, list_item_layout.getId(), listText.getId(), wordlist));
and then for MyAdapter...
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView; //is this the list_item_layout that I passed??
TextView tv = (TextView) v.findViewById(5001);
// ** QUESTION ** do I pass 'wordlist' again here?
tv.setText( wordlist[position] );
return v;
}
}
What happens when I run this on my device is I get the following errors...
10-08 23:11:19.775: E/AndroidRuntime(18276): FATAL EXCEPTION: main
10-08 23:11:19.775: E/AndroidRuntime(18276): android.content.res.Resources$NotFoundException: String resource ID #0x0
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.content.res.Resources.getText(Resources.java:222)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.widget.TextView.setText(TextView.java:3011)
10-08 23:11:19.775: E/AndroidRuntime(18276): at com.turista.client.TuristaClientMain.onClick(TuristaClientMain.java:113)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View.performClick(View.java:2538)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View$PerformClick.run(View.java:9152)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.handleCallback(Handler.java:587)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.dispatchMessage(Handler.java:92)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Looper.loop(Looper.java:123)
10-08 23:11:19.775: E/AndroidRuntime(18276): at android.app.ActivityThread.main(ActivityThread.java:3691)
10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invokeNative(Native Method)
10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invoke(Method.java:507)
10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-08 23:11:19.775: E/AndroidRuntime(18276): at dalvik.system.NativeStart.main(Native Method)
Can anyone explain how to do this programmatically?
* EDITED * October 9, 2012
Ok, as I am still stuck in this issue I think I've made some improvements but still get error messages. The improved code is as follows..
//wordlist is a global variable
String[] wordlist = new String[] {a, b, c};
// ..
// .. inside onCreate...
ListView list = new ListView(this);
list.setAdapter(new MyAdapter(this, R.layout.listitem, R.id.mLargeTextView, wordlist));
// since the ArrayAdapter class needs XML parameters to inflate, I created a dummy layout
now inside MyAdapter class..
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout listLayout = new LinearLayout(Main.this);
listLayout.setLayoutParams(new LayoutParams(wrapContent, wrapContent));
listLayout.setId(5000);
TextView listText = new TextView(Main.this);
listText.setId(5001);
listLayout.addView(listText);
listText.setText(wordlist[position]);
return listLayout;
}
}
As you can see, I think I have to override getView in order to display my custom view so this is what I did. Unfortunately I think I misunderstood it. Here are the errors..
10-09 09:24:10.095: E/AndroidRuntime(2517): FATAL EXCEPTION: main
10-09 09:24:10.095: E/AndroidRuntime(2517): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.ListView.measureScrapChild(ListView.java:1183)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.ListView.measureHeightOfChildren(ListView.java:1266)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.ListView.onMeasure(ListView.java:1175)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
10-09 09:24:10.095: E/AndroidRuntime(2517): at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.View.measure(View.java:8366)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewRoot.performTraversals(ViewRoot.java:847)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.view.ViewRoot.handleMessage(ViewRoot.java:1868)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.os.Looper.loop(Looper.java:123)
10-09 09:24:10.095: E/AndroidRuntime(2517): at android.app.ActivityThread.main(ActivityThread.java:3691)
10-09 09:24:10.095: E/AndroidRuntime(2517): at java.lang.reflect.Method.invokeNative(Native Method)
10-09 09:24:10.095: E/AndroidRuntime(2517): at java.lang.reflect.Method.invoke(Method.java:507)
10-09 09:24:10.095: E/AndroidRuntime(2517): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
10-09 09:24:10.095: E/AndroidRuntime(2517): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-09 09:24:10.095: E/AndroidRuntime(2517): at dalvik.system.NativeStart.main(Native Method)
ListView
extends AbsListView
which in turn extends AdapterView
which extends view group. So all the child of ListView
would be added to ViewGroup
. So to set the layout param, you can
use ViewGroup.LayoutParam while setting layout param for listLayout
.
Or try AbsListView.LayoutParams
for setting layout param for listLayout
Please try it and let me know if it worked.
Following code is working fine..
public class MainActivity1 extends Activity {
String[] wordlist = new String[] { "a", "b", "c" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView list = new ListView(this);
list.setAdapter(new MyAdapter(this, wordlist));
setContentView(list);
}
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, String[] strings) {
super(context, -1, -1, strings);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout listLayout = new LinearLayout(MainActivity1.this);
listLayout.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.WRAP_CONTENT,
AbsListView.LayoutParams.WRAP_CONTENT));
listLayout.setId(5000);
TextView listText = new TextView(MainActivity1.this);
listText.setId(5001);
listLayout.addView(listText);
listText.setText(super.getItem(position));
return listLayout;
}
}
}
The problem was that by default Eclipse imports ViewGroup.LayoutParams
which are incompatible with the AbsListView.LayoutParams
which need to be used for setting layout param for view returned from the getView()
method.
Please check and let me know how it went..
这篇关于创建自定义列表项一个ListView以编程方式在Android的 - 没有XML列表项目布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!