2013-07-30 3 views
0

어떻게 사용자 정의 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)에

+0

먼저주의해야 할 점은 사용자 지정 어댑터를 사용하지 않는다는 것입니다. 두 ListFragments의 ArrayAdapter 인스턴스를 인스턴스화합니다. – btse

+0

목록 조각에서 사용자 지정 어댑터를 사용하는 경우 누군가가 응용 프로그램에 로그인 할 때 자동으로 소유자 목록을 가져 오지 않겠습니까? 내가 뭘 찾고 있었는지 두 조각 (왜이 emtpy ArrayAdapter 을 사용하는 이유입니다)에 아무것도 표시하지 않고 응용 프로그램을로드하는 것입니다. 사용자가 검색을 수행하면 하나 이상의 소유자를 표시합니다. 조각을 사용하는 방법을 배우려고합니다. 나는 잠시 동안 이걸로 싸우고있어. – Gagouche

+1

전혀 아닙니다. 이미하는 것처럼 데이터 배열에 빈 배열을 전달합니다. 그런 다음 필요할 때 배열에 데이터를 추가하고'adapter.notifyDataSetChanged()'를 호출하십시오. – btse

답변

0

@btse가 맞았다! 빈 items 목록을 맞춤 어댑터에 보내면 AsyncTaskonPostExecute에있는 notifyDataSetChanged()으로 전화하면됩니다. 이 전화 후에 Android에서 ListFragment을 채우는 것을 처리합니다.어댑터가 비어있을 때

당신은 당신의 XML로 (참고 here)는 "검색하십시오 소유자"유형의 메시지를 배치 할 수 있습니다 :

<TextView android:id="@id/android:empty" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#FF0000" 
      android:text="Please search owner"/> 

당신이 공백으로 마칠 수있었습니다합니다.

행운을 빈다.

+0

사용자가 뭔가를 검색 할 때 asynctask에서 소유자 목록을 호출하고 있기 때문에 나는 정말로 혼란스러워합니다. 그런 다음 조각에 대한 인수로 전달하고 Oncreate에서 검색합니다. onPostEecute에서 notifyDataSetChange()를 호출해야한다면 ListFragment에서 asynckTask를 직접 호출하지 않기 때문에 데이터를 ListFragment에 전달해야합니다. 나는 그것에 대해 좀 더 읽어야 할 필요가 있다고 생각합니다. 특히 FragmentActivity에서 FragmentList로 객체를 전송하는 경우 – Gagouche

+0

Aaaah OK. 앱이 어떻게 작동하는지에 대한 아이디어가 없으면 제 답변에서 구체적으로 설명하기가 어렵습니다. 귀하의 의견을 바탕으로, 나는 그 조각을 검색 할 때 인스턴스화되지 않습니다 걸릴까요? 그렇지 않으면 조각이 작성되고 사용자가 검색을 수행하면 AsyncTask에서 검색된 새'items'로 사용자 정의 어댑터를 다시 바인드하는 메소드를 프래그먼트에 표시 할 수 있습니다. 그게 도움이 되니? – CodeMonkey

+0

저는 프래그먼트로 놀고 있습니다. 목표는 사용자가 사용자 이름과 암호를 사용하여 로그인하도록 허용하는 것입니다. 사용자가 로그인하면 오른쪽에 몇 가지 검색 옵션이있는 선형 레이아웃이 있습니다. 왼쪽에는 두 조각이 있습니다. 상단 조각에는 소유자 목록이 표시됩니다. 그러나 소유자 목록에는 검색 기준을 충족하는 소유자가 한 명 이상있는 경우에만 표시됩니다. 사용자가 상단 조각에서 소유자를 클릭하면 왼쪽 하단 조각에 자신이 소유 한 자동차 목록이 표시됩니다. – Gagouche

관련 문제