创建自定义列表项一个ListView以编程方式在Android的 - 没有XML列表项目布局 [英] Creating a ListView with custom list items programmatically in Android - no xml list item layout

查看:250
本文介绍了创建自定义列表项一个ListView以编程方式在Android的 - 没有XML列表项目布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如我看到的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屋!

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