بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مشکل با نمایش اطلاعات گرفته شده از sqLite database در ListView(حل شد)

مدیریت گفتگو
amirfallahi 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان 

من یه لیست ویو رو طبق آموزش استاد میخوام پر کنم که شامل عکس و متن هست.

توی StructNote ( برای من StructUser) دو تا استرینگ گذاشتم به این صورت: 

public class StructUser {
    public String userimage;
    public String username;
}

کلاس AdapterUser رو هم به این صورت تعریف کردم

public class AdapterUsers extends ArrayAdapter {
 
    public AdapterUsers(ArrayList array){
 
        super(G.context , R.layout.listrow , array);
    }
 
    private static class ViewHolder {
 
        public ImageView imguser;
        public TextView txtnameuser;
 
        public ViewHolder (View view){
 
            imguser = (ImageView)view.findViewById(R.id.imguser);
            txtnameuser = (TextView)view.findViewById(R.id.txtnameuser);
 
        }
 
        public void fill(ArrayAdapter adapter , StructUser item , int position){
 
            txtnameuser.setText(item.username);
 
            Bitmap bitmap = getBitmapFromAsset(G.context , item.userimage);
            imguser.setImageBitmap(bitmap);
        }
 
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        ViewHolder holder;
        StructUser item = getItem(position);
 
        if(convertView == null)
        {
            G.layoutInflater.inflate(R.layout.listrow , parent , false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.fill(this , item , position);
        return convertView;
 
    }
 
    public static Bitmap getBitmapFromAsset(Context paramContext, String strName)
    {
        AssetManager assetManager = paramContext.getAssets();
        InputStream istr = null;
 
        try {
            istr = assetManager.open(strName);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        Bitmap bitmap = BitmapFactory.decodeStream(istr);
        return bitmap;
    }
 
}

 

 

توی اکتیویتی لیست ویو هم این کد ها رو نوشتم :

 

public class ActivityShowInfo extends Activity {
 
    private LayoutInflater inflater;
    private View view;
    public ArrayList Suser = new ArrayList();
    public ArrayAdapter adapteruser;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_showinfo);
 
        adapteruser = new AdapterUsers(Suser);
 
        inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.slidingmenu,null);
 
 
        Boolean isFirstRun = getSharedPreferences("PREFERENCE", MODE_PRIVATE)
                .getBoolean("isFirstRun", true);
 
        if (isFirstRun) {
            startActivity(new Intent(ActivityShowInfo.this, FirstLaunch.class));
            finish();
        }
 
        // set the content view
        setContentView(R.layout.activity_showinfo);
        // configure the SlidingMenu
        SlidingMenu menu = new SlidingMenu(this);
        menu.setMode(SlidingMenu.RIGHT);
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        menu.setShadowDrawable(R.drawable.shadow);
        menu.setFadeDegree(0.35f);
        menu.setBehindOffset(100);
        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
 
        view.findViewById(R.id.LnewUser).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //open alert new user
                // G.Userdatabase.execSQL("INSERT INTO users (users_name , users_pic ) VALUES ( 'amir' , 1 )");
                G.adduser( "sss", "mard.png" , "off");
            }
        });
        ListView listuser = (ListView)view.findViewById(R.id.lstUsers);
        listuser.setAdapter(adapteruser);
 
        Cursor cursors = G.Userdatabase.rawQuery("SELECT * FROM users WHERE users_on = 'off' " , null);
 
        if(cursors != null) {
            try {
                if (cursors.getCount() > 0) {
 
                    for(int i = 0 ; i < cursors.getCount() ; i++){
                        StructUser users = new StructUser();
                        cursors.moveToNext();
                        users.username = cursors.getString(cursors.getColumnIndex("users_name"));
                        users.userimage = cursors.getString(cursors.getColumnIndex("users_pic"));
                        Suser.add(users);
                    }
 
                    adapteruser.notifyDataSetChanged();
                }
            }
            finally {
                cursors.close();
            }
        }
        menu.setMenu(view);
    }
}

 

البته لیست ویو داخل یه اسلایدینگ منو قرار داره ...
حالا وقتی اجرا میکنم کرش میکنه و این ارور ها توی لاگ کت نمایش داده میشه ...

01-29 16:55:19.529      439-528/? E/InputDispatcher﹕ channel '53339c50 amir.fallahi.pill.reminder/amir.fallahi.pill.reminder.ActivityShowInfo (server)' ~ Channel is unrecoverably broken and will be disposed!
01-29 17:17:18.545  30009-30009/? E/Trace﹕ error opening trace file: No such file or directory (2)
01-29 17:17:18.621  30009-30009/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at amir.fallahi.pill.reminder.AdapterUsers$ViewHolder.(AdapterUsers.java:35)
            at amir.fallahi.pill.reminder.AdapterUsers.getView(AdapterUsers.java:59)

 

 

 

چه کنم دوستان؟ لطفا کمک :)

نظرات

amirfallahi 11 سال پیش
دوستان میدونم خیلی زیاده کد ها و خوندنش یکم وقت گیره ولی خواهش میکنم یه کمکی یه سرنخی لینکی چیزی بهم بدید که بتونم مشکل رو پیدا کنم...
Spirit 11 سال پیش
فقط log رو خوندم ، خطای nullpointer داری علتشم این هست که اون مسیر یا فایل وجود نداره ...
amirfallahi 11 سال پیش
مرسی اسپریت جان. مشکل این بود که وجود داره فایل ولی این میگه نیست :|

پاسخ‌ها 1

Hossein Kurd 11 سال پیش

دوست عزیز خط 35 AdapterUser تعیین کردی :

G.layoutInflater.inflate(R.layout.listrow , parent , false);

خب Layout Inflater ارش چیه؟ تیدیل xml به View ، و باید اون رو توی converView قرار بدی

 convertView = G.layoutInflater.inflate(R.layout.listrow , parent , false);

به خطاها دقت کن :

java.lang.NullPointerException

و دوخط پایین اون تعیین می کنه که Error از کدوم خط در کدوم کلاس ناشی می شه:

            at amir.fallahi.pill.reminder.AdapterUsers$ViewHolder.(AdapterUsers.java:35)
            at amir.fallahi.pill.reminder.AdapterUsers.getView(AdapterUsers.java:59)

در کلاس AdapterUsers.java خط 35

نظرات

amirfallahi 11 سال پیش
سلام آقا حسین. ممنونم این اینفلیتور مال همون منویی هست که اضافه کردمش. که کار میکنه و مشکلی نداره برای لیست ویو یه اینفلیتور دیگه داخل کلاس جی مثل استاد تعریف کردم. الان به نظرت من این اینفلیتور رو پاک کنم و از همون که تو کلاس جی هست استفاده کنم درست میشه به نظرت؟
amirfallahi 11 سال پیش
یعنی منظورم اینه دوتا اینفلیتور لازمه یا یکی کافیه؟ و میشه دو جا ازش استفاده کرد؟
amirfallahi 11 سال پیش
این که درست شد واقعا ممنونم ازت ولی این سوال دومم رو بگم آیا میشه از همون اینفلیتور داخل کلاس جی برای دو تا xml استفاده کرد؟
Hossein Kurd 11 سال پیش
یکی کافیه ، من همزمانی LayoutInflater رو تست نکردم اما توی یک Activity اگر دوتا لیست ویو داری واسشون دوتا LayoutInflater بذار اما در صفحات جداگانه من همیشه از یک LayoutInflater بخ صورت مشترک استفاده می کنم
amirfallahi 11 سال پیش
تو یه اکتیویتی هستن . یکیشون مال لیست ویو یکیشونم مال منویی که لیست ویو توش نمایش داده میشه . بعد یه سوال دیگه از همین کد ها... چرا عکسم نمایش داده نمیشه؟ داخل پوشه asset هست. اسمشم درست داخل دیتابیس ذخیره کردم. مگر اینکه اسم رو بدون پسوند لازم باشه که ذخیره کنیم
amirfallahi 11 سال پیش
تست کردم بدون پسوند باید میبود ;)
Hossein Kurd 11 سال پیش
چرا عکس رو توی Drawable قرار نمی دی ؟
amirfallahi 11 سال پیش
اتفاقا همین کارو کردم که درست شد. :)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .