我如何使用充气自定义ArrayAdapter一个ListFragment? [英] How Do I inflate a ListFragment with a custom ArrayAdapter?

查看:167
本文介绍了我如何使用充气自定义ArrayAdapter一个ListFragment?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何膨胀与自定义ArrayAdapter一个ListFragment?
我有两个班所有者和汽车。用户将搜索的所有者,它会使用ListFragments表示1或所有者。此外,如果用户要点击所有者,它应该显示其拥有汽车的明细表。我创建了以下类/辅助类(CarDetail和OwnerDetail - 这两个类扩展ListFragment,人们扩展FragmentActivity,CarAdapter和OwnerAdapter自定义适配器,CarAsyncTask和OwnerAsyncTask AsyncTasks,并登录扩展活动)。登录类允许用户登录和搜索的所有者。当在用户登录并执行搜索,一个或多个所有者应显示布局的上部分。不过,我一直无法得到它的显示。这里是我的codeS:

How Do I inflate a ListFragment with a custom ArrayAdapter? I have two classes "Owner and Car". The user will search for an owner, and it will display one or owners using ListFragments. In addition, if the user were to click on an owner, it should display a detail list of cars that the owner owns. I’ve created the following classes/helper classes (CarDetail and OwnerDetail – these two classes extends ListFragment, People Extends FragmentActivity, CarAdapter and OwnerAdapter custom adapter, CarAsyncTask and OwnerAsyncTask AsyncTasks, and Login that extend activity). The login class allows a user to login and search for an owner. When the user logs in and do a search, one or more owners should display on the upper section of the layout. However, I have not been able to get it to display. Here are my codes:

//更新于07/30 @ 10:50 AM
我更新了OwnerDetail onActivityCreated使用OwnerActivityAdapter。然而,它在设定持有人的TextView时抛出异常。在底部见异常。

//Updated on 07/30 @10:50 AM I updated the OwnerDetail onActivityCreated to use the OwnerActivityAdapter. However, It's throwing an exception in the when setting the TextView for the holder. See exception at the bottom.

为了简单的原因,我将只显示文本的部分一部分。

For simplicity reason, I will only display partial part of the text.

//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>

//更新于07/30 @ 10:50 AM
//这里是异常

14 07-30:18:15.155:E / AndroidRuntime(864):致命异常:主要
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.OwnerAdapter.getView(OwnerAdapter.java:48)
07-30 14:18:15.155:E / AndroidRuntime(864):在android.widget.AbsListView.obtainView(AbsListView.java:2033)
07-30 14:18:15.155:E / AndroidRuntime(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.measureChildWithMargins(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.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): FATAL EXCEPTION: main 07-30 14:18:15.155: E/AndroidRuntime(864): java.lang.NullPointerException 07-30 14:18:15.155: E/AndroidRuntime(864): at com.mb.carlovers.adapter.OwnerAdapter.getView(OwnerAdapter.java:48) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.AbsListView.obtainView(AbsListView.java:2033) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.ListView.onMeasure(ListView.java:1127) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.View.measure(View.java:12603) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.View.measure(View.java:12603) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.View.measure(View.java:12603) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 07-30 14:18:15.155: E/AndroidRuntime(864): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)

推荐答案

@btse是当场上!你可以简单地发送一个空项目列表中自定义适配器,然后调用 notifyDataSetChanged() onPostExecute 你的的AsyncTask 。 Android的手柄此调用后填充你的 ListFragment

@btse is spot on! You could simply send an empty items list to the custom adapter, then call notifyDataSetChanged() on the onPostExecute of your AsyncTask. Android handles populating your ListFragment after this call.

您甚至可以放置一个请搜索店主类型的消息时,适配器是空的(参考的此处)在你的XML:

You could even place a "Please search owner" type message when the adapter is empty (reference here) in your xml:

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

如果你不想让它空白。

祝你好运!

这篇关于我如何使用充气自定义ArrayAdapter一个ListFragment?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆