如何将setListAdapter扩展为主布局?

时间:2011-12-22 11:56:33

标签: android

我正在尝试创建从服务器抓取的商家列表,并将其显示在列表视图中的搜索框下方。

我使用setListAdapter来调用我发送数组的arrayAdapter类。当我运行代码时,它会创建一个带有resuts的新屏幕。我想在同一个屏幕上显示结果。

这是我的主要布局:

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

    <ImageView  
        android:layout_width="fill_parent" 
        android:layout_height="60px" 
        android:scaleType="fitXY"
        android:src="@drawable/logo" />

    <RelativeLayout  
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:id="@+id/rel1" 
        android:gravity="right">
        <AutoCompleteTextView 
            android:id="@+id/autocomplete_classif"
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:layout_centerInParent="true"/>
        <Button 
            android:id="@+id/button1" 
            android:text="Search" 
            android:onClick="myClickHandler" 
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" 
            android:layout_alignParentTop="true" 
            android:layout_alignParentRight="true">
        </Button>

    </RelativeLayout>

    <EditText 
        android:layout_height="wrap_content" 
        android:id="@+id/editText2" 
        android:layout_gravity="center_horizontal" 
        android:text="" 
        android:layout_width="match_parent"
        android:visibility="gone">
    </EditText>
    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:id="@+id/mylocation"
        android:lines="1" 
        android:textColor="#000000" 
        android:gravity="center"
        android:scrollbars="vertical">
    </TextView>

<ProgressBar 
    android:id="@+id/progressBar1" 
    android:layout_width="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_height="wrap_content" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:visibility="gone"> 
</ProgressBar>

    <TextView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/pagetext" android:lines="50"
        android:textColor="#000000"
        android:background="#CCCCCC"
        android:padding="5px"
        android:scrollbars="vertical">
    </TextView>
</LinearLayout>

这是我动态膨胀的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:padding="10px"
    android:layout_height="140px" android:id="@+id/rlt_main"
    android:background="#FFFFFF"
    android:textColor="#000000">

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/bus_name"
        android:text="Name" ></TextView>

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/description" 
        android:layout_below="@+id/bus_name" android:layout_marginLeft="10px"></TextView>

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/distance" 
        android:layout_below="@+id/description" android:layout_marginLeft="10px"></TextView>

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/longitude" 
        android:layout_below="@+id/distance" android:layout_marginLeft="10px"></TextView>

    <ImageView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_centerVertical="true"
        android:id="@+id/iv_forward" android:background="@drawable/forward_arrow"
        android:layout_alignParentRight="true"></ImageView>

</RelativeLayout>

这是我整理数据并将其发送给我的班级的方式:

if(found) {
    jArray = new JSONObject(result);
    JSONArray  jResult = jArray.getJSONArray("result");

    StringBuilder output = new StringBuilder();
    ArrayList<ArrayList<String>> varray = new ArrayList<ArrayList<String>>();
    for(int i=0;i < jResult.length();i++){    
        JSONObject e = jResult.getJSONObject(i);

        output.append(e.getString("webid") + "\n");

        output.append(e.getString("webDistance") + "\n");

        String longi = e.getString("webLongtitude");

        String lati = e.getString("webLatitude");
        String geoURI = String.format("geo:%s,%s", lati, longi);   
        output.append(geoURI+"\n");

        output.append("--------------------------------------------\n");
        ArrayList<String> det = new ArrayList<String>();
        det.add(e.getString("webEntryName"));
        det.add(e.getString("webAddress"));
        det.add(e.getString("webDistance"));
        det.add(e.getString("webLongtitude"));
        det.add(e.getString("webLatitude"));
        varray.add(det);

    }

    setListAdapter(new busListAdapter(this, varray ));
}

这是arrayAdapter类:

package com.dentons.dentonsweb;

import java.util.ArrayList;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class busListAdapter extends ArrayAdapter<ArrayList<String>> {
    private final Activity context;
    private final ArrayList<ArrayList<String>> varray;  
    private  ArrayList<String> varray2;

    public busListAdapter(DentonswebActivity context, ArrayList<ArrayList<String>> varray) {
        super(context, R.layout.business_list_item, varray);
        this.context = context;
        this.varray = varray;
    }



    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }

    @Override

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = context.getLayoutInflater();
            View row=inflater.inflate(R.layout.business_list_item, parent, false);

            TextView label=(TextView)row.findViewById(R.id.bus_name);
            TextView description=(TextView)row.findViewById(R.id.description);
            TextView distance=(TextView)row.findViewById(R.id.distance);
            TextView longitude=(TextView)row.findViewById(R.id.longitude);

        varray2 = varray.get(position);

        label.setText(varray2.get(0));
        description.setText(varray2.get(1));
        distance.setText(varray2.get(2));
        longitude.setText(varray2.get(3));

        return row;
    }
}

如果我能找到一种告诉布局扩展为main的方法,那将是很好的但我似乎无法从这个类中获得对main的引用。我所管理的最好的是通胀在第一个屏幕内发生,但没有结果。我不记得我是怎么做到的。我是Java的新手。


这是最新的代码:

这出现在main.xml

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:id="@+id/pagetext" android:lines="50"
    android:textColor="#000000"
    android:background="#CCCCCC"
    android:padding="5px"
    android:scrollbars="vertical">
</TextView>

这是新的busListAdapter:

package com.dentons.dentonsweb;

import java.util.ArrayList;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class busListAdapter extends ArrayAdapter<ArrayList<String>> {
    private final Activity context;
    private final ArrayList<ArrayList<String>> varray;  
    private  ArrayList<String> varray2;

    public busListAdapter(DentonswebActivity context, ArrayList<ArrayList<String>> varray) {
        super(context, R.layout.business_list_item, varray);
        this.context = context;
        this.varray = varray;
    }



    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }

    @Override

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = context.getLayoutInflater();
            View row=inflater.inflate(R.layout.business_list_item, parent, false);

            TextView label=(TextView)row.findViewById(R.id.bus_name);
            TextView description=(TextView)row.findViewById(R.id.description);
            TextView distance=(TextView)row.findViewById(R.id.distance);
            TextView longitude=(TextView)row.findViewById(R.id.longitude);

        varray2 = varray.get(position);

        label.setText(varray2.get(0));
        description.setText(varray2.get(1));
        distance.setText(varray2.get(2));
        longitude.setText(varray2.get(3));

        return row;
    }
}

这是主叫代码:

ViewStub stub = (ViewStub) findViewById(R.id.viewStub1);
stub.inflate();

setListAdapter(new busListAdapter(this, varray ));

任何想法为什么这仍然在空白页面上打开。

1 个答案:

答案 0 :(得分:1)

您可以使用ViewStub创建布局。您将ViewStub放在要扩展布局的主布局中,并根据需要设置参数。
例如:

 <ViewStub android:id="@+id/stub"
           android:inflatedId="@+id/newId"
           android:layout="@layout/layoutName"
           android:layout_width="match_parent"
           android:layout_height="140dp" />

这将扩展到layout / layoutName.xml中定义的布局。 当你想要给视图充气时,你会找到存根,然后调用它的inflate()方法:

ViewStub stub = (ViewStub) findViewById(R.id.stub);
stub.inflate();

现在新的布局就是以前的存根,你可以找到你的列表并在其上设置适配器:

ListView list = (ListView) findViewById(R.id.listId);
list.setAdapter(yourAdapter);

注意:没有必要使用ViewStub来创建列表,它只是在这里用作与膨胀列表视图相关的原始问题,尽管您描述的问题是因为您使用ListActivity而不是Activity(见下文)。

您还应将活动更改为正常Activity而不是ListActivity(或根据documentation guidelines更改布局),因为ListActivity旨在将列表设为只显示元素,这就是为什么你的自定义布局现在被替换为列表。

  

ListActivity的默认布局由单个布局组成,   屏幕中央的全屏列表。但是,如果你愿意,   您可以通过设置自己的视图布局来自定义屏幕布局   在onCreate()中使用setContentView()。要做到这一点,你自己的观点必须   包含一个ID为“@android:id / list”的ListView对象(或列出if   它在代码中)

我希望这可以解决一些问题。