PDA

View Full Version : مشکل در مقدار دهی به لیست ویو از Custom List



sobhan1990
چهارشنبه 25 اردیبهشت 1392, 12:41 عصر
سلام
طبق آموزش های سایت آقای کمالان میخواستم از یک Custom List به یک لیست ویو مقدار دهی کنم ولی توی لیست ویو چیزی نشون داده نمیشه! ظاهرا همه چیز درسته ولی در عمل جواب نمیده!
برنامه رو آپلود کردم:
http://uplods.ir/up/myAdapter.zip
با تشکر

sobhan1990
چهارشنبه 25 اردیبهشت 1392, 14:20 عصر
کلاس لیست آداپتورم اینه:


public class ListAdapter extends BaseAdapter {

private LayoutInflater myInflater;
private List<PhoneBook> list;

public ListAdapter(Context context) {
myInflater = LayoutInflater.from(context);
}

public void setData(List<PhoneBook> list) {
this.list = list;
Log.i(&quot;Tag00000&quot;, &quot;Data passed to the adapter.&quot;);
}

@Override
public int getCount() {
return 0;
}

@Override
public Object getItem(int arg0) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

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

if (convertView == null) {
convertView = myInflater.inflate(R.layout.row, null);
holder = new ViewHolder();
holder.Name = (TextView) convertView.findViewById(R.id.Name);
holder.Family = (TextView) convertView.findViewById(R.id.Family);
holder.Tel = (TextView) convertView.findViewById(R.id.Tel);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.Name.setTag(list.get(position).GetName());
holder.Name.setText(list.get(position).GetName());
holder.Family.setText(list.get(position).GetFamily ());
holder.Tel.setText(list.get(position).GetTel());

return convertView;
}

static class ViewHolder {
TextView Name;
TextView Family;
TextView Tel;
}

}




کلاس مین اکتیویتی :



public class MainActivity extends Activity {
ListView listView;
List<PhoneBook> phone;
private ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

adapter = new ListAdapter(this);

phone = new ArrayList<PhoneBook>();

for(int i = 1; i <= 5; i++)
{
PhoneBook p = new PhoneBook();
p.setName(&quot;Akbar &quot; + Integer.toString(i));
p.setFamily(&quot;Mousavi &quot; + Integer.toString(i));
p.setTel(&quot;0912&quot; + Integer.toString(i));
phone.add(p);
}
listView = (ListView)findViewById(R.id.listView1);

this.refreshList();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
protected void refreshList() {

Log.i(&quot;00000000&quot;,Integer.toString(phone.size()));
adapter.setData(phone);

Log.i(&quot;...tel Adapter set&quot;, &quot;...&quot;);
listView.setAdapter(adapter);
Log.i(&quot;...ListView Adapter set&quot;, &quot;...&quot;);
for(int i = 1; i <= phone.size(); i++)
Log.i(&quot;44444444&quot;, phone.get(i).GetName());
}
}




کلاس دفتر تلفن:


package com.example.myadapter;

public class PhoneBook {
private String _Name;
private String _Family;
private String _Tel;

public void setName(String Name)
{this._Name = Name;}

public String GetName()
{return this._Name;}

public void setFamily(String Family)
{this._Family = Family;}

public String GetFamily()
{return this._Family;}

public void setTel(String Tel)
{this._Tel = Tel;}

public String GetTel()
{return this._Tel;}
}

[/JAVA]

یه xml برای لیست سفارشی تعریف کردم:
[JAVA]
<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>

<RelativeLayout
xmlns:android = &quot;http://schemas.android.com/apk/res/android&quot;
android:id = &quot;@+id/rlContainer&quot;
android:layout_width = &quot;fill_parent&quot;
android:layout_height = &quot;wrap_content&quot; >

<TextView
android:id=&quot;@+id/Name&quot;
android:layout_width=&quot;wrap_content&quot;
android:layout_height=&quot;wrap_content&quot;
android:layout_alignParentRight=&quot;true&quot;
android:layout_alignParentTop=&quot;true&quot;
android:layout_marginRight=&quot;33dp&quot;
android:singleLine=&quot;true&quot;
android:text=&quot;Name&quot;
android:textAppearance=&quot;?android:attr/textAppearanceLarge&quot; />

<TextView
android:id=&quot;@+id/Family&quot;
android:layout_width=&quot;wrap_content&quot;
android:layout_height=&quot;wrap_content&quot;
android:layout_alignParentTop=&quot;true&quot;
android:layout_centerHorizontal=&quot;true&quot;
android:singleLine=&quot;true&quot;
android:text=&quot;Family&quot;
android:textAppearance=&quot;?android:attr/textAppearanceLarge&quot; />

<TextView
android:id=&quot;@+id/Tel&quot;
android:layout_width=&quot;wrap_content&quot;
android:layout_height=&quot;wrap_content&quot;
android:layout_alignParentTop=&quot;true&quot;
android:layout_marginRight=&quot;46dp&quot;
android:layout_toLeftOf=&quot;@+id/Family&quot;
android:singleLine=&quot;true&quot;
android:text=&quot;Tel&quot;
android:textAppearance=&quot;?android:attr/textAppearanceLarge&quot; />

<View
android:layout_width=&quot;wrap_content&quot;
android:layout_height=&quot;40dp&quot;
android:layout_alignParentLeft=&quot;true&quot;
android:layout_alignParentTop=&quot;true&quot; />

</RelativeLayout>


و اینم xml اصلی برنامه:


<RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
xmlns:tools=&quot;http://schemas.android.com/tools&quot;
android:layout_width=&quot;fill_parent&quot;
android:layout_height=&quot;fill_parent&quot;
tools:context=&quot;.MainActivity&quot; >

<ListView
android:id=&quot;@+id/listView1&quot;
android:layout_width=&quot;fill_parent&quot;
android:layout_height=&quot;wrap_content&quot;
android:layout_alignParentLeft=&quot;true&quot;
android:layout_alignParentTop=&quot;true&quot; >
</ListView>

</RelativeLayout>


با تشکر

sobhan1990
چهارشنبه 25 اردیبهشت 1392, 22:29 عصر
سلام

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

Modernidea
پنج شنبه 26 اردیبهشت 1392, 02:29 صبح
سلام

مشکل واقعا کوچک است اما صد در صد تاثیر گذار!
در کلاس BaseAdabter متد getCount ای که تعریف کردید، مقدار صفر بر میگرداند که این اشتباه است و باعث این مشکل میشود.
پس باید به این شکل باشد:

@Override
public int getCount() {
return list.size();
}


و اما یک نکته:
شماره ایندکس اکثر آرایه ها و لیست ها از صفر شروع میشود، پس سعی کنید همیشه برای حلقه ها بازه را از صفر تا یکی کوچکتر از سایز آرایه استفاده کنید تا کد صحیح عمل کند. مثلا زمانی که قصد گرفتن شماره سطری از یک ListView را داشته باشید، به علت اینکه بازه آن از 0 شروع میشود، در بعضی مواقع موجب خطا شود.
مثلا شما برای مقدار دهی آرایه به این شکل عمل کردید:

for(int i = 1; i <= 5; i++) {
PhoneBook p = new PhoneBook();
p.setName(&quot;Akbar &quot; + Integer.toString(i));
p.setFamily(&quot;Mousavi &quot; + Integer.toString(i));
p.setTel(&quot;0912&quot; + Integer.toString(i));
phone.add(p);
}

وقتی قصد بازیابی سطری را دارید، خطا تولید میشود:

for(int i = 1; i <= phone.size(); i++)
Log.i("44444444", phone.get(i).GetName());


به علت اینکه شما بازه را از 1 تا سایز آرایه که 5 است تعیین کردید، در صورتی که ایندکس لیست از 0 تا 4 ایجاد شده است!

پس شکل صحیح آن:

for(int i = 0; i < 5; i++) {
PhoneBook p = new PhoneBook();
p.setName(&quot;Akbar &quot; + Integer.toString(i));
p.setFamily(&quot;Mousavi &quot; + Integer.toString(i));
p.setTel(&quot;0912&quot; + Integer.toString(i));
phone.add(p);
}



for(int i = 0; i < phone.size(); i++)
Log.i("44444444", phone.get(i).GetName());



موفق باشید.