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

استفاده از کد json در list view (یک مشکل عجیب!)

مدیریت گفتگو
شهریاری 2 10 سال پیش
آخرین تغییر: 9 سال پیش

ُسلام دوستان

راستش من یه مشکل عجیب غریب دارم

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

 

 

 

نکته دیگه اینکه وقتی از سمت سرور اطلاعات رو میگیرم، باز کد json درست دریافت میشه

ولی وقتی میخام به لیست ویو بریزمش، چیزی نشون داده نمیشه. اینم کد   : 

 

 

یعنی log هارو درست نشون میده ولی چیزی داخل listview نشون نمیده. انگار listview رو نذاشتم اصلا. خالی خالی!

 

 

نظرات

amirhossein1376 10 سال پیش
مشکل از این کد نیست پس . کد layout لیست ویو و همینطور کد آداپتر لیست ویو رو بزارید.اوش هم تو نت پد کپی کنید مرتب باشه
محمد 10 سال پیش
این چیزی که میگم جواب سوالت نیست. ترتیب کدهای شما استاندارد نیست. اول لیست سوره ها رو تکمیل کن. بعدش adapter رو با لیستت درست کن. listview رو setAdapter کن. در آخر notifyDataSetChanged. آخرش هم میگم از resyclerView بجای ListView استفاده کن (یکی از مزایای RecyclerView مصرف رم کمتره)

پاسخ‌ها 5

شهریاری 2 10 سال پیش

کد لیست ویو:

 

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lstView"/>

    </LinearLayout>

</LinearLayout>

کدهای آداپتورم هم تقریبا مثل کدهای استاد هست:

 public class AdapterSoureh extends ArrayAdapter<StructSoureh> {


    public AdapterSoureh(ArrayList<StructSoureh> array) {
        super(G.context, R.layout.name_soureh_note, array);
    }


    private static class ViewHolder {

        public TextView txtNameSoureh;
        public TextView txtNumber;
        public Button btnOpen;

        public ViewHolder(View view) {
            txtNameSoureh = (TextView) view.findViewById(R.id.txtNameSoureh);
            txtNumber = (TextView) view.findViewById(R.id.txtNumber);
            btnOpen = (Button) view.findViewById(R.id.btnOpen);
        }

        public void Fill(
                ArrayAdapter<StructSoureh> adapter, StructSoureh item, final int position) {
            txtNameSoureh.setText(item.Name);

            txtNumber.setText(Integer.toString(item.NumberAyes));
           
            btnOpen.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            //go to next intent
                            Intent intent = new Intent(G.currentActivity, ActivitySelectSession.class);
                            intent.putExtra("POSITION", position);
                            G.currentActivity.startActivity(intent);
                        }
                    });
            //barresi kardane boodane tamaame file haaye mp3 marboot be soureh morede nazar dar sd card

            if(item.Downloaded) {
                // image downloaded = true
            } else {
                //image downloaded = false
            }

        }
    }

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

        StructSoureh item = getItem(position);
        if(convertView == null) {
            convertView = G.Inflater.inflate(R.layout.name_soureh_note, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.Fill(this, item, position);
        return convertView;
    }
}

نظرات

amirhossein1376 10 سال پیش
خوب adapter هم مشکلی نداره ولی چون listview رو wrap_content گذاشتین شاید از اون باشه مشکل
شهریاری 2 10 سال پیش

تشکر بابت کمکی که میکنید.

نه دوست عزیز. به جای wrap_content، مقادیر :

  <ListView
            android:layout_width="380dp"
            android:layout_height="332dp"
            android:id="@+id/lstView"/>

زیر رو گذاشتم که بازم چیزی نشون نمیده.

اینم کدهای name_soureh_note:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/btnOpen"
        android:layout_marginLeft="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:id="@+id/txtNumber"
        android:text="number"
        android:layout_marginLeft="32dip"
        android:layout_weight=".33" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="نام سوره"
        android:id="@+id/txtNameSoureh"
        android:layout_marginLeft="32dip"
        android:layout_weight=".33" />

</LinearLayout>

 

 

 

نظرات

amirhossein1376 10 سال پیش
مشکل همینجاست به لایوت orientation ندادین و همینطور نباید هم ارتفاع و هم عرضش match_parent باشه چون کل صفحه رو میگیره .
شهریاری 2 10 سال پیش
خب پس چرا وقتی که یه مقدار الکی میذارم (یعنی کاری به داده های دیتابیس ندارم)، درست نشون میده؟ گرچه الان من تغییراتی رو که گفتید انجام دادم ولی باز کار نکرد
amirhossein1376 10 سال پیش
آهان من اون بالا ندیدم این مورد رو پس شاید بعد دریافت اطلاعات adapter.notifyDataSetChanged رو صدا نمیزنید
شهریاری 2 10 سال پیش
اگه صدا نمیزدم که برای داده های الکی هم لیست ویو رو نشون نمیداد.
شهریاری 2 10 سال پیش

تغییراتی که گفتید:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
              android:orientation="horizontal">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/btnOpen"
        android:layout_marginLeft="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:id="@+id/txtNumber"
        android:text="number"
        android:layout_marginLeft="32dip"
        android:layout_weight=".33" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="نام سوره"
        android:id="@+id/txtNameSoureh"
        android:layout_marginLeft="32dip"
        android:layout_weight=".33" />

</LinearLayout>

 

 

نظرات

شهریاری 2 10 سال پیش

یه سوال:

کدهای ارتباط با سرور رو من داخل یک thread میذارم.

درسته؟ تا اجرا بشه و برنامه کرش نکنه.

یعنی thread ای که مربوط به ui برنامه میشه ، داره برای خودش کار میکنه و این thread هم برای خودش میره با سرور ارتباط برقرار میکنه. درسته؟

پس چطوری میتونه به ui دسترسی داشته باشه و مقادیر رو به listview نشون بده؟

نظرات

شهریاری 2 10 سال پیش

حل شد!!

 

وقتی که یک سری کد رو داخل Thread می نویسید اگه توی کدها کدی باشه که UI برنامه رو تغییر بده (مثلا setText برای TextView) برنامه کرش می کنه چون که فقط باید از طریق Thread اصلی UI رو تغییر بدید. به خاطر همین توی Thread هرجا کدی می خواست که UI رو تغییر بده اون کد رو داخل Handler می نویسید. مثلا:

finalTextView txt =(TextView) findViewById(R.id.txt);
finalHandler handler =newHandler();

Thread thread =newThread(newRunnable(){

@Override
publicvoid run(){
handler.post(newRunnable(){

@Override
publicvoid run(){
txt.setText("سلام");
}
});
}
});

با این کد txt.setText که توی thread نوشته شده در واقع توی Thread اصلی اجرا میشه.

باید به این نکته توجه داشته باشی که Handler رو توی thread تعریف نکنی.

نظرات

Miaad 9 سال پیش
دوست عزیز دقیقا منم همین مشکل رو دارم اگر میشه یک مقدار با خود کد توضیح بدی ممنونت میشم که بفهمم مشکل از کجاست ، فقط برنامه من کرش نمیکنه ولی لیست ویو رو نشون نمیده البته زمانی که میخوام اطلاعات رو از طریق جیسون بگیرم لیست ویو رو دیگه نشون نمیده در حالت نرمال نشون میده
شهریاری 2 9 سال پیش
سلامت باشید. بنظرم مشکل از کد جیسونی باشه که در برنامه شما دریافت میشه. بنظرم این باشه. منم یه همچین مشکلی داشتم. اخه کد جیسون مثلا درست بود ولی در سمت جاوا، ارایه مورد نظر در جیسون رو پیدا نمیکرد. در نتیجه هیچی در لیست ویو نمایش نمیداد یه بررسی بکن ببین همینه
h.k.m 9 سال پیش
سلام..من به این مشکل بر خوردم و الان تقریبا یک هفته ست دارم روش کار میکنم و همه ی روش هایی رو که گفته شده رو امتحان کردم ولی باز هم لیست ویو رو خالی نشون میده.. پروژه اندروید مارکت استادو با اندروید استادیو میخام اجرا کنم که به همچین مشکلی بر خوردم..یعنی دیتا های دریافتی از سرور رو ادپت نمیکنه..نمیدونم چرا

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