0

BaseAdapterを使用して、独自のデータセットを持つオブジェクトのリストを渡します。リストビューの各行には、画像、説明などがあります。各オブジェクトの。BaseAdapterを設定したまま使用すると、エラーが発生せず、デバッガーとlogcatでオブジェクトのリストが有効であり、nullではないことを何度も確認しました。しかし、何らかの理由で、リストは正しい数のオブジェクトで作成されますが、ImageViews、TextViews、またはその他のいずれかがデータを取得することはありません。各行の唯一のものは、リスト行のxmlレイアウトで使用するのと同じデフォルトデータです。これは、各ビューのsetメソッドの呼び出しが何らかの理由で無視されているか、ビューのコンテンツが画面上の別のコンテキストまたは奇妙なものに渡されているようなものです。とにかくここに私のBaseAdapterクラスがあります:

 class MaItemAdapter extends BaseAdapter{
        List<Ma> mas = null;
        Context cntx = null;
        //LayoutInflater myInflater;
        int itemPosition =0;
        ViewHolder holder;

        public MarkItemAdapter(Activity cntx,List<Ma> mas){
            super();
            this.mas = mas;
            this.cntx = cntx;
            //myInflater = LayoutInflater.from(cntx);

        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mas.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mas.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            itemPosition = position;
            RelativeLayout rl = null;
            Mark ma = mas.get(itemPosition);
            if (convertView==null) {
                rl = (RelativeLayout) LayoutInflater.from(cntx).inflate(
                        R.layout.ma_row_item, parent, false);
                holder = new ViewHolder();
                try{
                holder.description = (TextView) rl.findViewById(R.id.ma_description);
                holder.distance = (TextView) rl.findViewById(R.id.ma_distance);
                holder.ma_image = (ImageView) rl.findViewById(R.id.ma_image);
                holder.view_ma = (ImageButton) rl.findViewById(R.id.view_ma);
                holder.rate_ma = (RatingBar) rl.findViewById(R.id.rate_ma);
                holder.description.setText(ma.title);
                holder.distance.setText(ma.getDistanceString());
                holder.view_ma.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View arg0) {
                    //dostuff
                }

            });
            if(ma.textImg!=null &&
                    !ma.textImg.isRecycled()){
            holder.ma_image.setImageBitmap(ma.textImg);
            }else{
                holder.ma_image.setImageResource(R.raw.skyma);
            }}catch(NullPointerException e){}
            }else{
                rl = (RelativeLayout) convertView;
            }


        //add logic for rating bar

            return rl;
        }


    }

//convenience class to create views 
    private class ViewHolder{
        ImageView ma_image;
        TextView description;
        TextView distance;
        ImageButton view_ma;
        RatingBar rate_ma;

        public ViewHolder(){
            ma_image = new ImageView(getApplicationContext());
            description = new TextView(getApplicationContext());
            distance = new TextView(getApplicationContext());
            view_ma = new ImageButton(getApplicationContext());
            rate_ma = new RatingBar(getApplicationContext());
        }
    }

}

私はいくつかのチュートリアルを実行しましたが、それらは正常に機能しますが、このセットアップを自分のアプリで使用すると、失敗します。正しい方向への助けは素晴らしいでしょう。もう1つ言及しなければならないのは、評価バーを押すと、4行または5行ごとに同じ評価がポップアップ表示されることです。どんな助けでも大歓迎です。

4

1 に答える 1

1

getView メソッドでこれを試してください...これが私のカスタムアダプターのセットアップ方法です。

itemPosition = position;
View v = convertView;
Mark ma = mas.get(itemPosition);

if (v == null) {
    LayoutInflater inflater = (LayoutInflater) cntx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.ma_row_item, null);
    holder = new ViewHolder();
}

holder.description = (TextView) v.findViewById(R.id.ma_description);
holder.distance = (TextView) v.findViewById(R.id.ma_distance);
holder.ma_image = (ImageView) v.findViewById(R.id.ma_image);
holder.view_ma = (ImageButton) v.findViewById(R.id.view_ma);
holder.rate_ma = (RatingBar) v.findViewById(R.id.rate_ma);
holder.description.setText(ma.title);
holder.distance.setText(ma.getDistanceString());
holder.view_ma.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View arg0) {
        //dostuff
    }

});

if(ma.textImg!=null && !ma.textImg.isRecycled()) {
    holder.ma_image.setImageBitmap(ma.textImg);
} else {
    holder.ma_image.setImageResource(R.raw.skyma);
}

それでもうまくいかない場合は、ViewHolder ではなく、getView メソッド本体内から個々のビューを初期化することをお勧めします。何かのようなもの:

TextView description = (TextView) v.findViewById(R.id.ma_description);
description.setText(ma.title);
于 2012-06-21T23:57:36.140 に答える