android:为什么列表视图中没有元素出现?

时间:2013-01-18 02:09:02

标签: java android

我正在尝试使用ListView作为杂志阅读器应用程序中的主要导航功能。我希望列表中的每个视图在与其关联的图像下方显示故事的标题。我创建了一个XML布局,其中包含一个垂直方向的LinearLayout,顶部是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;       
}   

该应用程序启动正常,我可以看到列表视图的背景,但列表中没有项目。为什么是这样?很明显,我对android开发很新,但对Java的基础知识有很好的理解。我知道这是由于我在这里遇到的一个根本性的误解,也许是其中一个构造函数的错误(我对某些参数仍然有些模糊)。无论如何,如果有人能帮助我更深入地理解这些问题,我将非常感激。

提前致谢

P.S。在android和java下对它进行分类是不好的形式?我以后应该只使用android吗?

---编辑:

    class GalAdapter extends ArrayAdapter<String> {
    Activity context;
    String[] hlines;
    int[] imgs;

    public GalAdapter(String[] hlines, int[] imgs) {
        super (MainActivity.this, R.layout.galleryview , hlines);
        this.hlines = hlines;
        this.imgs = imgs;
    }       
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        if (convertView == null){
        LayoutInflater li = (LayoutInflater)context. getSystemService (Context.LAYOUT_INFLATER_SERVICE);
        convertView = li.inflate(R.layout.galleryview, parent);
        ImageView image = (ImageView)convertView.findViewById(R.id.image);
        TextView headline = (TextView)convertView.findViewById(R.id.headline);

        image.setImageResource(imgs[position]);
        headline.setText(hlines[position]);}
        return convertView;                                 
    }
    }

现在我在调用LayoutInflator的行上得到一个空指针异常。它指的是什么指针?我假设我没有正确地将数组(String [] hlines + int [] imgs)传递给它......这是我打电话的地方:

    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);

2 个答案:

答案 0 :(得分:1)

看看这里https://github.com/cplain/custom-list它可以帮到你一点,你需要在你的convertView中使用getView()我建议你把一个列表放入你的适配器而不是在里面做一个

答案 1 :(得分:0)

您的适配器未正确创建。要使用ArrayAdapter,您必须:

  1. 将项目列表提供给超级实施
  2. 将项目直接添加到适配器或
  3. 覆盖对适配器保存的数据进行分类所需的所有方法,例如getCount()getItem()等。
  4. 最简单的解决方法是更改​​构造函数:

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

    这样做允许适配器实现使用您的一个数组来确定列表中有多少项,以及调用getItem()时应返回的数据。由于您要覆盖getView(),因此第二个参数甚至不是必需的,您也可以使用super(MainActivity.this, 0, headlines)。{/ p>

    如果最终实现它从这样的多个数组中收集数据,最终可能最好直接创建自定义适配器作为BaseAdapter的子类,因为您已经绕过了大部分功能{{1提供方便。

相关问题