سلام آقا حسین. ممنونم
این اینفلیتور مال همون منویی هست که اضافه کردمش. که کار میکنه و مشکلی نداره
برای لیست ویو یه اینفلیتور دیگه داخل کلاس جی مثل استاد تعریف کردم.
الان به نظرت من این اینفلیتور رو پاک کنم و از همون که تو کلاس جی هست استفاده کنم درست میشه به نظرت؟
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
مشکل با نمایش اطلاعات گرفته شده از sqLite database در ListView(حل شد)
مدیریت گفتگو
آخرین تغییر: 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)
چه کنم دوستان؟ لطفا کمک :)
پاسخها 1
دوست عزیز خط 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
نظرات
یعنی منظورم اینه دوتا اینفلیتور لازمه یا یکی کافیه؟ و میشه دو جا ازش استفاده کرد؟
این که درست شد واقعا ممنونم ازت ولی این سوال دومم رو بگم آیا میشه از همون اینفلیتور داخل کلاس جی برای دو تا xml استفاده کرد؟
یکی کافیه ، من همزمانی LayoutInflater رو تست نکردم اما توی یک Activity اگر دوتا لیست ویو داری واسشون دوتا LayoutInflater بذار اما در صفحات جداگانه من همیشه از یک LayoutInflater بخ صورت مشترک استفاده می کنم
تو یه اکتیویتی هستن . یکیشون مال لیست ویو یکیشونم مال منویی که لیست ویو توش نمایش داده میشه .
بعد یه سوال دیگه از همین کد ها... چرا عکسم نمایش داده نمیشه؟ داخل پوشه asset هست. اسمشم درست داخل دیتابیس ذخیره کردم. مگر اینکه اسم رو بدون پسوند لازم باشه که ذخیره کنیم
تست کردم بدون پسوند باید میبود ;)
چرا عکس رو توی Drawable قرار نمی دی ؟
اتفاقا همین کارو کردم که درست شد. :)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات