0

私はParse.comサーバーを使用しており、サーバーからデータを取得して、TextViewの4つのフィールドを持つカスタムリストに入れようとしています。データは正常に受信されましたが、リストの最初の位置にあるアダプターに問題があり、すべてのtextViewフィールドでnullポインター例外が発生します。残りのフィールドでは問題はありません。

これは私が使用しているコードです:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_coupon_list);

    init(); 
}

private void init(){
    couponListView = (ListView)findViewById(android.R.id.list);
    couponList = new ArrayList<ParseObject>();
    query = new ParseQuery(COUPON_CLASS_NAME);

    couponListView.setOnItemClickListener(this);

    query.findInBackground(new FindCallback() {             
        @Override
        public void done(List<ParseObject> list, ParseException e) {
            if (e == null) { //objects retrieved well                                                           
                couponList.addAll(list);                                                        
            }
            else {
                toaster("problem find coupons");
            }

            MyAdapter adapter = new MyAdapter(
                    getApplicationContext(), 
                    android.R.layout.simple_list_item_1, 
                    R.id.tv_coupoun_content,
                    couponList);

            setListAdapter(adapter);

        }
    });                     
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_coupon_list, menu);
    return true;
}   

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}

public class MyAdapter extends ArrayAdapter<ParseObject> {

    public MyAdapter(Context context, int resource, int textViewResourceId, ArrayList<ParseObject> couponList) {
        super(context, resource, textViewResourceId, couponList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater lf = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = lf.inflate(R.layout.coupon_row, parent, false);                                     

        tvCouponContent = (TextView)findViewById(R.id.tv_coupoun_content);
        tvBusinessName = (TextView)findViewById(R.id.tv_business_name);
        tvBusinessStreet = (TextView)findViewById(R.id.tv_street);
        tvBusinessCity = (TextView)findViewById(R.id.tv_city);

        //in position 0 the log below is true for all in the rest its false


        Log.d("Shalom","shalom - " + Boolean.toString(tvCouponContent == null)+" "+
                Boolean.toString(tvBusinessName == null)+" "+
                Boolean.toString(tvBusinessStreet == null)+" "+
                Boolean.toString(tvBusinessCity == null)+" "+
                Integer.toString(position));

        /*tvCouponContent.setText(coupons.getString(COUPON_CONTENT));           
        tvBusinessName.setText(coupons.getString(COUPON_BUSINESS_NAME));
        tvBusinessStreet.setText(coupons.getString(COUPON_STREET));
        tvBusinessCity.setText(coupons.getString(COUPON_CITY));*/

        return row;
    }
}
4

1 に答える 1

2

アダプタコンストラクタが間違っています。次のコンストラクタを使用してください。

public MyAdapter(Context context, ArrayList<ParseObject> couponList) {
    super(context, R.layout.coupon_row, couponList);
}

それをインスタンス化するために:

MyAdapter adapter = new MyAdapter(getApplicationContext(),couponList);

アイテムをリストビューに膨らませるには、膨らませたオブジェクトを使用する必要があります。

View row = lf.inflate(R.layout.coupon_row, parent, false);

tvCouponContent = (TextView)findViewById(R.id.tv_coupoun_content); //BAD

tvCouponContent = (TextView)row.findViewById(R.id.tv_coupoun_content);//GOOD

ビューホルダーパターンを使用する必要があります:http ://www.jmanzano.es/blog/?p = 166

于 2012-11-13T17:50:44.300 に答える