【问题标题】:Problem overriding getView()覆盖 getView() 的问题
【发布时间】:2011-05-08 14:18:22
【问题描述】:

我在覆盖我的 getview 方法时不断收到错误消息。这就是我所拥有的:

公共类 UnwatchedEpisodesActivity 扩展 ListActivity{

private String[] values = new String[]{"Row 1", "Row 2", "Row 3"};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.episode_main);
    setListAdapter(new EpisodeListAdapter());

}

private class EpisodeListAdapter extends ArrayAdapter<String>{

    private LayoutInflater li = LayoutInflater.from(this.getContext());

    public EpisodeListAdapter(){
        super(UnwatchedEpisodesActivity.this, 0, values);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null){
            convertView = li.inflate(R.layout.episode_row, parent, false);
        }

        ((TextView) convertView.findViewById(R.id.text1)).setText(values[position]);
        return convertView;
    }

}

我的 xml 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/ep_layout"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:id="@android:id/text1" />
</LinearLayout>

(我也试过不使用线性布局,没有区别) 我得到this error.

你们有什么想法吗?

还有一个问题: 如果我想按组分隔值,我该怎么办?我想要一个列表显示如下内容:

-----------
first part
-----------
Row 1
Row 2
-----------
second part
-----------
Row 3

显然这只是一个例子;基本上我想知道如何添加那些“分隔符”

【问题讨论】:

    标签: java android listview


    【解决方案1】:

    你应该通过

    设置你的TextView的ID
    android:id="@+id/text1"
    

    这部分:android:id="@android:id/text1"不正确!

    为了分隔您的项目,您应该使用ExpandableListActivity 而不是ListActivity,您的组将是部分(第一、第二等),子列表将是您当前的values

    在这种情况下,您应该使用BaseExpandableListAdapter 来填充您的视图。
    尽管您需要覆盖一些方法,但使用适当的数据结构不会有问题。例如,您可以参考this example

    那么你的getView 方法的主体应该放在BaseExpandableListAdaptergetChildView 方法中,并且你应该为getGroupView 覆盖的部分使用另一个TextView 或更复杂的布局。

    这样您就可以将您的剧集分成几部分。

    【讨论】:

    • 这似乎是问题所在。谢谢!另外:你对我的第二个问题有什么想法吗?
    • 请查看我的更新,了解将您的剧集分成几部分的解决方案。
    【解决方案2】:

    使用android:id="@+id/text1" 代替 android:id="@android:id/text1" 第一部分。

    对于第二期,据我了解您的需求:

    您应该为 getView() 方法中的不同位置填充不同的 xml。 例如:

    if (position == 0) {
        convertView = li.inflate(R.layout.episode_row, parent, false);
        //fetch the text view and other things and set their value
        return convertView;
    } else if (position == 1) {
        //similarly do here also and return convertview
    }
    

    希望这将有助于解决您的问题。

    【讨论】:

    • getView() 是否为数组的每个位置循环?如果是,我可以看到这项工作,而且看起来很容易..
    • 是的,getView() 是针对每个位置循环的,这很容易做到,您可以根据需要对其进行自定义。万事如意...:)
    • 请注意,尽管此解决方案可以应用于平面数据结构,但您需要将标题值插入到剧集列表中,或者您必须能够确定每个部分的第一集。 position = 0 适用于第一项,并且在上面的 if 子句中它显示标题而不是第一个 iem!对于分层数据结构,ExpandableListView 是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多