어떻게 사용자 정의 ArrayAdapter를 사용하여 ListFragment를 확장합니까? 두 가지 클래스 "Owner and Car"가 있습니다. 사용자는 소유자를 검색하고 ListFragments를 사용하는 소유자를 표시합니다. 또한 사용자가 소유자를 클릭하면 소유자가 소유 한 자동차의 세부 정보 목록을 표시해야합니다. 다음 클래스/도우미 클래스 (CarDetail 및 OwnerDetail)를 작성했습니다.이 두 클래스는 ListFragment, People Extends FragmentActivity, CarAdapter 및 OwnerAdapter 사용자 정의 어댑터, CarAsyncTask 및 OwnerAsyncTask AsyncTasks 및 Login 활동을 확장합니다. 로그인 클래스를 사용하면 사용자가 로그인하여 소유자를 검색 할 수 있습니다. 사용자가 로그인하여 검색을 수행 할 때 레이아웃의 상단 섹션에 하나 이상의 소유자가 표시되어야합니다. 그러나 나는 그것을 표시 할 수 없었습니다.어떻게 사용자 정의 ArrayAdapter를 사용하여 ListFragment를 확장합니까?
// 07/30 @ 10 : 50에 업데이트되었습니다. OwnerActivityAdapter를 사용하도록 OwnerDetail onActivityCreated를 업데이트했습니다. 그러나 홀더에 TextView를 설정할 때 예외가 발생합니다. 하단의 예외 참조.
간단히하기 위해 텍스트의 일부분 만 표시합니다. 50 AM // 여기서 예외는
07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) FATAL EXCEPTION
//Car Class
public class Car {
private String _make;
private String _model;
private String _year;
public Car(String make, String model, String year)
{
this._make = make;
this._model = model;
this._year = year;
}
}
//Owner Class
public class Owner {
private String _firstName;
private String _lastName;
private String _carId;
private Car _car;
public Owner(String lName, String fName, String cId, Car car)
{
this._lastName = lName;
this._firstName = fName;
this._carId = cId;
this._car = car;
}
}
package com.mb.carlovers;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
//Car Detail
public class CarDetail extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.customize_layout,container,false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
String[] myCars = {};
super.onActivityCreated(savedInstanceState);
ArrayAdapter<String> carAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1, myCars);
setListAdapter(carAdapter);
}
}
//OnwerDetail class
public class OwnerDetail extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.customize_layout,container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Updated on 07/30 @10:50 AM
//Change this class to use the OwnerAsyncTask()
OnwerAsyncTask asynTask = new OnwerAsyncTask();
List<Owner> lt = null;
try {
lt = asynTask.execute("").get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Owner myOwners[] = lt.toArray(new Owner[lt.size()]);
super.onActivityCreated(savedInstanceState);
OwnerAdapter ownerAdapter = new OwnerAdapter(getActivity(),android.R.layout.simple_list_item_activated_1 , myOwners);
setListAdapter(ownerAdapter);
}
//People where the new Fragment should be created
public class People extends FragmentActivity implements OnClickListener, OnItemSelectedListener {
private Button search;
private EditText etSearchBy, etSearchByID;
private Spinner spOption;
private String selectedOption = null;
private TextView tvErrorMessage;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.people);
InitializeVariables();
}
private void InitializeVariables()
{
etSearchBy = (EditText) this.findViewById(R.id.etByLastName);
etSearchByID = (EditText) this.findViewById(R.id.etCarID);
spOption = (Spinner) this.findViewById(R.id.spOption);
search = (Button) this.findViewById(R.id.bSearch);
search.setOnClickListener(this);
tvErrorMessage = (TextView) this.findViewById(R.id.tvErrorMessage);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.spOptions, android.R.layout.simple_spinner_dropdown_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spOption.setAdapter(adapter);
spOption.setOnItemSelectedListener(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onPause() {
super.onPause();
}
@Override
public void onClick(View v) {
String searchByName = etSearchBy.getText().toString();
String searchById = etSearchByID.getText().toString();
if(selectedOption == null || selectedOption == "All")
{
if(searchByName.matches("") || searchById.matches(""))
{
tvErrorMessage.setText("You must select a last name and car id");
} else
{
}
} else if(selectedOption == "Name")
{
if(!searchByName.matches(""))
{
try
{
**//Here is the List of information that I need to inflate the fragment with.**
OnwerAsyncTask ownerAsyncTask = new OnwerAsyncTask();
List<Owner> owner = ownerAsyncTask.execute("").get();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
{
tvErrorMessage.setText("You must enter the last name of the owner.");
}
} else if (selectedOption == "ID")
{
if(!searchById.matches(""))
{
String st = null;
String d = st;
} else
{
tvErrorMessage.setText("You must enter the car id that you'd like to search.");
}
}
}
//Owner Adapter – (The Car Adapter looks similar to this except the variables name are different.)
public class OwnerAdapter extends ArrayAdapter<Owner> {
private Context context;
private int layoutResourceId;
private Owner data[] = null;
public OwnerAdapter(Context context, int resource, int textViewResourceId,Owner[] data) {
super(context, resource, textViewResourceId, data);
this.context = context;
this.layoutResourceId = resource;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
OwnerHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new OwnerHolder();
holder.tvFirstName = (TextView) row.findViewById(R.id.tvFirstName);
holder.tvLastName = (TextView) row.findViewById(R.id.tvLastName);
holder.tvCarId = (TextView) row.findViewById(R.id.tvCarID);
row.setTag(holder);
} else
{
holder = (OwnerHolder) row.getTag();
}
Owner item = data[position];
**//Updated on 07/30 @10:50 AM
// Below is where I am getting the exception**
holder.tvFirstName.setText(item.getFirstName().toString());
holder.tvLastName.setText(item.getLastName().toString());
holder.tvCarId.setText(item.getCarId().toString());
return row;
}
static class OwnerHolder
{
TextView tvFirstName;
TextView tvLastName;
TextView tvCarId;
}
}
//Owner AsyncTask –(CarAsyncTask is also similar)
public class OnwerAsyncTask extends AsyncTask<String, Void, List<Owner>> {
private List<Owner> items = null;
@Override
protected List<Owner> doInBackground(String... params) {
try
{
items = new ArrayList<Owner>();
items.add(new Owner("John", "Smith", "1"));
items.add(new Owner("Samantha", "Right", "2"));
items.add(new Owner("Regie", "Miller", "3"));
items.add(new Owner("Mark", "Adam", "4"));
} catch(Exception ex)
{
ex.toString();
}
return items;
}
@Override
protected void onPostExecute(List<Owner> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
//My customize Layout for the listfragment
<?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"
android:orientation="vertical" >
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
<TextView
android:id="@id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No record to be displayed." />
</LinearLayout>
는 7월 30일 10 @ 업데이트 // : 메인 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : java.lang.NullPointerException 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : com.mb.carlovers.adapter. (AdaptersList.java:2033) 07-30 14 : 18 : 15.155 : 15.155 : E/AndroidR (864) : android.widget.ListView.onMeasure (ListView.java:1127) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.view.View.measure (View.java : 12603) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:4677) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1369) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.widget.LinearLayout.measureVertical (LinearLayout.java:660) 07 -30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.widget.LinearLayout.onMeasure (LinearLayout.java:553) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android. view.View.measure (View.java:12603) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.view.ViewGroup.me asureChildWithMargins (ViewGroup.java:4677) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.widget.FrameLayout.onMeasure (FrameLayout.java:293) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.view.View.measure (View.java:12603) 07-30 14 : 18 : 15.155 : E/AndroidRuntime (864) : android.view.ViewGroup.measureChildWithMargins (ViewGroup. 자바 : 4677) 07-30 14 : 18 : 15.155은 : E가/AndroidRuntime (864) android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1369)에
먼저주의해야 할 점은 사용자 지정 어댑터를 사용하지 않는다는 것입니다. 두 ListFragments의 ArrayAdapter 인스턴스를 인스턴스화합니다. – btse
목록 조각에서 사용자 지정 어댑터를 사용하는 경우 누군가가 응용 프로그램에 로그인 할 때 자동으로 소유자 목록을 가져 오지 않겠습니까? 내가 뭘 찾고 있었는지 두 조각 (왜이 emtpy ArrayAdapter을 사용하는 이유입니다)에 아무것도 표시하지 않고 응용 프로그램을로드하는 것입니다. 사용자가 검색을 수행하면 하나 이상의 소유자를 표시합니다. 조각을 사용하는 방법을 배우려고합니다. 나는 잠시 동안 이걸로 싸우고있어. –
Gagouche
전혀 아닙니다. 이미하는 것처럼 데이터 배열에 빈 배열을 전달합니다. 그런 다음 필요할 때 배열에 데이터를 추가하고'adapter.notifyDataSetChanged()'를 호출하십시오. – btse