Java android:为什么我的listview中没有出现元素?

Java android:为什么我的listview中没有出现元素?,java,android,Java,Android,我正在尝试使用ListView作为杂志阅读器应用程序的主要导航功能。我希望列表中的每个视图在与其关联的图像下方显示一个故事的标题。我已经创建了一个XML布局,上面有一个垂直方向的线性布局,上面有一个ImageView,下面有一个TextView,我正在尝试创建一个自定义适配器,在getView方法中扩展这个布局,并将图像/文本资源放入其中。这是我的密码: package com.example.caliber; import java.util.List; import com.example.

我正在尝试使用ListView作为杂志阅读器应用程序的主要导航功能。我希望列表中的每个视图在与其关联的图像下方显示一个故事的标题。我已经创建了一个XML布局,上面有一个垂直方向的线性布局,上面有一个ImageView,下面有一个TextView,我正在尝试创建一个自定义适配器,在getView方法中扩展这个布局,并将图像/文本资源放入其中。这是我的密码:

package com.example.caliber;
import java.util.List;
import com.example.caliber.R;

public class MainActivity extends Activity {
Spinner issues, sections;
Button blog;
ListView mainGal;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] issueList = {"issues", "fall '12", "spring '12", "fall '11", "spring '12", 
                            "fall '10", "spring '10"};
    String[] sectionList = {"sections", "campus", "entertainment", "lifestyle", "love&sex", "tech&web", "Current" };

    ArrayAdapter<String> aaIssues = new ArrayAdapter<String>(this, R.layout.spin_item, issueList);
    ArrayAdapter<String> aaSections = new ArrayAdapter<String>(this,   
R.layout.spin_item, sectionList);

    blog = (Button)findViewById(R.id.blogBtn);

    issues = (Spinner)findViewById(R.id.issueSpin);
    sections = (Spinner)findViewById(R.id.sectionSpin);             
    issues.setAdapter(aaIssues);
    sections.setAdapter(aaSections);


    OnClickListener mbListener = new OnClickListener() {
        @Override
            public void onClick(View v){
        issues.setAlpha((float) 0.5);
        sections.setAlpha((float) 0.5);
        blog.setAlpha((float) 0.5);
        }
     };


    ImageButton mainbtn = (ImageButton)findViewById(R.id.cbutton);      
    mainbtn.setOnClickListener(mbListener);

    mainGal = (ListView)findViewById(R.id.mainGal);
    GalAdapter ga = new GalAdapter();
    mainGal.setAdapter(ga);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

class GalAdapter extends ArrayAdapter<String> {
    Activity context;
    String[] headlines = {"Alpha bravo charlie delta", "Echo foxtrot golf 
hotel", "indigo juliette kilo lima"};
    int[] images = {R.drawable.img1, R.drawable.img2, R.drawable.img3};

    public GalAdapter() {
        super (MainActivity.this, R.layout.galleryview);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater li = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);         
        View story = li.inflate(R.layout.galleryview, parent);
        ImageView image = (ImageView)story.findViewById(R.id.image);
        TextView headline = (TextView)story.findViewById(R.id.headline);

        image.setImageResource(images[position]);
        headline.setText(headlines[position]);
        return story;       
}   

看看这里,它会对您有所帮助,您需要在
getView()
中使用
convertView
,我建议您将列表传递到适配器中,不要在其中创建一个列表。您的适配器未正确创建。要使用
阵列适配器
,您必须:

  • 向超级实现提供项目列表
  • 将项目直接添加到适配器,或
  • 覆盖对适配器持有的数据进行分类所需的所有方法,例如
    getCount()
    getItem()
    ,等等
  • 最简单的修复方法是更改构造函数,如下所示:

    public GalAdapter() {
        super(MainActivity.this, R.layout.galleryview, headlines);
    }
    
    这允许适配器实现使用一个数组来确定列表中有多少项,以及调用
    getItem()
    时它应该返回哪些数据。由于您正在重写
    getView()
    ,因此第二个参数甚至不是必需的,您可能还可以使用
    super(MainActivity.this,0,headlines)


    如果您的最终实现需要像这样从多个数组中收集数据,那么最终最好直接将自定义适配器创建为
    BaseAdapter
    的子类,因为您已经绕过了
    ArrayAdapter
    提供的大多数方便功能。

    您调用
    super.onCreate(savedInstanceState);setContentView(R.layout.activity_main)
    两次,去掉它-这是多余的。只是一个代码提示。哎呀,谢谢你指出了这个愚蠢的错误!啊,谢谢,这真的很有帮助。关于第二个参数,我想一定是这样。我已经更改了代码,但不幸的是,现在我得到了一个空指针异常。请查看我的编辑,因为引用
    代码中的Activity context
    从未设置为任何值,但随后您尝试对其调用方法。与其传递对Activity的引用,不如删除该行并使用
    GetLayoutFlater().inflate()
    代替。convertView=GetLayoutFlater().inflate(R.layout.galleryview,父级);aa现在我在同一行上遇到了一个不受支持的操作异常…再次感谢您的帮助,很抱歉让我感到如此痛苦。没关系,明白了!我需要将parent更改为null…不太清楚为什么会这样做,或者确切地说我是如何做的?实际上正确的更改不是更改
    parent
    null
    ,而是添加
    false
    作为第三个参数,即
    getLayoutInflater().inflate(R.layout.galleryview,parent,false)
    。在这种情况下,您只想对布局进行充气,而不想附加它。此示例使用了错误的模式,您不应该在
    inflate()中传递
    null
    。在父视图组中传递的原因
    getView()
    的唯一目的是在膨胀子视图时使用它,以便在此过程中正确评估布局参数。
        String[] headlines ={ "Echo foxtrot golf hotel", "Echo foxtrot golf hotel", "indigo   
    juliette kilo lima"};
        int[] images = {R.drawable.img1, R.drawable.img2, R.drawable.img3};
                ....
        mainGal = (ListView)findViewById(R.id.mainGal);
        GalAdapter ga = new GalAdapter(headlines, images);
        mainGal.setAdapter(ga);
    
    public GalAdapter() {
        super(MainActivity.this, R.layout.galleryview, headlines);
    }