0

雑誌リーダーアプリのメインナビゲーション機能としてListViewを使用しようとしています。リスト内の各ビューに、関連する画像の下にストーリーの見出しを表示したいと思います。上部にImageView、下部にTextViewを備えた垂直方向のLinearLayoutを使用してXMLレイアウトを作成し、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の基本をよく理解しています。これは、私がここで持っている根本的な誤解、おそらくコンストラクターの1つでのエラーによるものであることを認識しています(パラメーターのいくつかについてはまだ少しあいまいです)。とにかく、誰かが私がこれらの問題をより深く理解するのを手伝ってくれるなら、私は非常に感謝します。

前もって感謝します

psこれを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を呼び出した行でnullポインター例外が発生します。それはどのポインタを指しているのですか?配列(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);
4

2 に答える 2

1

ここを見てくださいhttps://github.com/cplain/custom-listそれはあなたを少し助けることができるでしょう、あなたはあなたの中で使う必要がありconvertViewます、getView()そして私はあなたのアダプターにリストを渡すのではなくあなたのアダプターにリストを渡すことをお勧めします

于 2013-01-18T02:23:07.733 に答える
0

アダプターが正しく作成されていません。を使用するにはArrayAdapter、次のいずれかを行う必要があります。

  1. アイテムのリストをスーパー実装に提供します
  2. アイテムをアダプターに直接追加するか、または
  3. getCount()、など、アダプタが保持するデータを分類するために必要なすべてのメソッドをオーバーライドしますgetItem()

最も簡単な修正は、コンストラクターを次のように変更することです。

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

getItem()これにより、アダプタ実装は配列の1つを使用して、リスト内のアイテムの数と、が呼び出されたときに返されるデータを決定できます。をオーバーライドしているので、2番目のパラメーターは実際には必要ではなく、おそらく同様getView()に回避できます。super(MainActivity.this, 0, headlines)

最終的な実装でこのような複数のアレイからデータを収集する場合は、便利BaseAdapterな機能のほとんどをすでにバイパスしているため、最終的にはカスタムアダプタを直接のサブクラスとして作成する方がよい場合があります。ArrayAdapter

于 2013-01-18T02:47:23.573 に答える