Android 自定义ListAdapter从不调用GetView

Android 自定义ListAdapter从不调用GetView,android,android-layout,android-listview,Android,Android Layout,Android Listview,我一直在试图弄清楚这是怎么回事有一段时间了,也许我已经盯着它太久了。。。我觉得这很简单 这是我的活动课 public class ResultsListActivity extends ListActivity { private ArrayList<Result> results = new ArrayList<Result>(); private ListView list; @Override public void on

我一直在试图弄清楚这是怎么回事有一段时间了,也许我已经盯着它太久了。。。我觉得这很简单

这是我的活动课

    public class ResultsListActivity extends ListActivity {
    private ArrayList<Result> results = new ArrayList<Result>();
    private ListView list;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sp_history);
        //set up list
        list = new ListView(this);

    }

    @Override
    protected void onResume()
    {
        super.onResume();
        results = openAndQueryDatabase();
        displayResultList();
    }
    private void displayResultList() {


        list.setAdapter(new HistoryArrayAdapter(this.getBaseContext(), results));

    }
    private ArrayList<Result> openAndQueryDatabase() {
        DatabaseHandler dbh = new DatabaseHandler(getBaseContext());
        ArrayList<Result> toReturn = dbh.getAllResults();
        return toReturn;

    }//open and query database

    public int getCount() {
        return null == results ? 0 : results.size();
    }

    }
公共类ResultsListActivity扩展了ListActivity{
private ArrayList results=new ArrayList();
私有列表视图列表;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.sp_历史);
//设置列表
列表=新列表视图(此);
}
@凌驾
受保护的void onResume()
{
super.onResume();
结果=openAndQueryDatabase();
displayResultList();
}
私有void显示结果列表(){
setAdapter(新的HistoryArrayAdapter(this.getBaseContext(),results));
}
私有ArrayList openAndQueryDatabase(){
DatabaseHandler dbh=新的DatabaseHandler(getBaseContext());
ArrayList toReturn=dbh.getAllResults();
回归回归;
}//打开并查询数据库
public int getCount(){
返回null==results?0:results.size();
}
}
这是我的ListAdapterClass

    public class HistoryArrayAdapter extends ArrayAdapter<Result> {


  private final Context context;
  private final ArrayList<Result> values;
  private int layoutId;

  public HistoryArrayAdapter(Context context, ArrayList<Result> results) {
    super(context, R.layout.history_row, results);
    this.context = context;
    this.layoutId = R.layout.history_row;
    this.values = results;
  }

  @Override
    public int getCount() {
        return values.size();// more than zero
    }

  @Override
    public Result getItem(int position) {

        return values.get(position);// may be in your case
    }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
      if(convertView==null)
      {
                      // inflate the layout
                      LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                      convertView = inflater.inflate(layoutId, parent, false);
      }// if convertView == null

    //set up our views
    TextView uploadSpeed = (TextView) convertView.findViewById(R.id.upload_speed_history);
    TextView downloadSpeed = (TextView) convertView.findViewById(R.id.download_speed_history);
    TextView pingTime = (TextView) convertView.findViewById(R.id.ping_history_text);
    TextView networkName = (TextView) convertView.findViewById(R.id.history_network_name);
    TextView dateTime = (TextView) convertView.findViewById(R.id.history_dateTime);
    ImageView imageView = (ImageView) convertView.findViewById(R.id.history_connection);

    //set up our values
    Result row = values.get(position);
    uploadSpeed.setText(row.getUpload());
    downloadSpeed.setText(row.getDownload());
    pingTime.setText(row.getPingTime());
    networkName.setText(row.getNetworkName());
    dateTime.setText(row.getDateTime());
    if(row.getNetworkType() == "NETWORK_WIFI")
        imageView.setImageResource(R.drawable.ico_wifi);
    else
        imageView.setImageResource(R.drawable.ico_cell);

    return convertView;
  }//getView

     } 
公共类历史ArrayAdapter扩展了ArrayAdapter{
私人最终语境;
私有最终ArrayList值;
私人内部布局;
公共历史ArrayAdapter(上下文、ArrayList结果){
super(上下文、R.layout.history_行、结果);
this.context=上下文;
this.layoutId=R.layout.history\u行;
这个值=结果;
}
@凌驾
public int getCount(){
返回值。size();//大于零
}
@凌驾
公共结果getItem(int位置){
返回值。get(position);//可能在您的情况下
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null)
{
//使布局膨胀
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
convertView=充气机。充气(layoutId,父项,false);
}//如果convertView==null
//树立我们的观点
TextView上传速度=(TextView)convertView.findViewById(R.id.upload\u speed\u history);
TextView下载速度=(TextView)convertView.findViewById(R.id.download\u speed\u history);
TextView pingTime=(TextView)convertView.findViewById(R.id.ping\u history\u text);
TextView networkName=(TextView)convertView.findViewById(R.id.history\u network\u name);
TextView dateTime=(TextView)convertView.findViewById(R.id.history\u dateTime);
ImageView ImageView=(ImageView)convertView.findViewById(R.id.history\u连接);
//树立我们的价值观
结果行=值。获取(位置);
uploadSpeed.setText(row.getUpload());
downloadSpeed.setText(row.getDownload());
pingTime.setText(row.getPingTime());
networkName.setText(row.getNetworkName());
dateTime.setText(row.getDateTime());
if(row.getNetworkType()=“网络\u WIFI”)
设置图像资源(R.drawable.ico_wifi);
其他的
setImageResource(R.drawable.ico_单元格);
返回视图;
}//getView
} 
下面是ListView的.xml文件

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

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="#b5b5b5"
    android:dividerHeight="1dp" />

 </LinearLayout>

这是行的布局

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

<RelativeLayout
    android:id="@+id/realtive_line_1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/history_network_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="26dp"
        android:layout_toRightOf="@+id/imageView1"
        android:text="TextView" />

    <ImageView
        android:id="@+id/history_connection"
        android:layout_width="20dip"
        android:layout_height="20dip"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft = "20dip"
        android:layout_marginTop = "5dip"
        android:src="@drawable/ico_wifi" />

    <TextView
        android:id="@+id/history_dateTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="65dp"
        android:layout_below="@+id/network_name"
        android:text="2013-08-15 12:35:00 PM" 
        android:textSize="10sp" />

</RelativeLayout>

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:layout_below="@+id/realtive_line_1"
    >

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="15dip"
        android:layout_height="15dip"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="23dp"
        android:layout_marginTop = "15dip"
        android:src="@drawable/ico_ping" />

    <TextView
        android:id="@+id/ping_history_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="25dp"
        android:layout_toRightOf="@+id/imageView2"
        android:text="30 ms"
        android:textSize = "15sp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/results_icon_up"
        android:layout_width="20dip"
        android:layout_height="20dip"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ico_up"
        android:layout_marginRight = "40dip" />

    <ImageView
        android:id="@+id/results_icon_down"
        android:layout_width="20dip"
        android:layout_height="20dip"
        android:layout_alignParentRight="true"
        android:layout_marginTop="5dip"
        android:layout_below ="@+id/results_icon_up"
        android:src="@drawable/ico_down"
        android:layout_marginRight = "40dip" />

    <TextView
        android:id="@+id/upload_speed_history"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/results_icon_down"
        android:layout_marginRight="15dp"
        android:layout_toLeftOf="@+id/results_icon_up"
        android:text="4.26 Mbps"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/download_speed_history"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/upload_speed_history"
        android:layout_alignTop="@+id/results_icon_down"
        android:text="24.56 Mbps"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

<ImageView
    android:id="@+id/imageView3"
    android:layout_width="20dip"
    android:layout_height="20dip"
    android:layout_alignParentRight ="true"
    android:layout_centerVertical="true"
    android:src="@drawable/arrow" />

 </RelativeLayout>

我知道的事情。。。我确实有结果。我可以在调试器中看到它,它们填充得很好。我知道我有一些看起来像是不必要的方法,需要做的工作是确保应用程序在填充列表之前不在程序的中间。

< P>更改你的<代码> OnCuto()/<代码>如下,

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sp_history);
        //set up list
        list = getListView();

    }

正如您所说的,您正在使用异步调用来获取数据库结果。。。即使在调试时您正在获得结果,但在实际运行时,结果可能是在以下行中设置了适配器之后获得的,因此适配器中的
results
的长度为0,因此您的
getView()
没有收到回调

可以有一个自定义的
侦听器
,当获取结果时,该侦听器将得到回调,然后您可以将适配器设置为listview,或者另一个解决方案可能是保留适配器的实例,然后使用
适配器将获取的结果添加到适配器。add()
方法,然后调用
适配器。notifyDataSetChanged()
方法


编辑:-在使用
ListActivity
时,无需创建新的
ListView
实例。只需调用
getListView()
方法,即可获得上述回答者建议的
ListView
实例。

您的
DatabaseHandler
类是否正在进行异步调用以获取结果???是的,我将返回结果。我可以在debugger.LayoutInflater inflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u inflater\u SERVICE)中看到它们;