如何从多个源填充一个ListView?

时间:2011-09-21 11:47:15

标签: java android xml

我有一个ListView。每个ListItem中都有三个TextView。

<LinearLayout android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout2"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center">
        <ImageView android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:id="@+id/imageView1"
            android:src="@drawable/icon" android:padding="5dip">
        </ImageView>
        <TextView android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:id="@+id/textView1"
            android:padding="5dip"
            android:text="First">
        </TextView>
        <LinearLayout android:id="@+id/LinearLayout01"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_weight="1">
            <TextView android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Second Text View" android:padding="5dip">
            </TextView>
            <TextView android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Third Text View"
                android:padding="5dip">
            </TextView>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

现在,我有三个ArrayList对象。假设这三个已经加载了。我已经有一个解析器,它从单个数组列表中生成三个数组列表!

["Main One","Main Two","Main Three","Main Four"]
["Top One","Top Two","Top Three","Top Four"]
["Bottom One","Bottom Two","Bottom Three","Bottom Four"]

我想将这些ArrayLists加载到List视图中。我做了一个预期输出的模型。

Mockup for what I'm trying to do

这有什么解决方案吗?我试图一个接一个地在同一个ListView上设置ListAdapter,但似乎根本不起作用。 感谢。

4 个答案:

答案 0 :(得分:1)

您应该通过扩展baseadapter来创建自定义适配器。

我会创建一个数据结构类

public class Data {
     String LeftMainString;
     String RightTopString;
     String RightBottomString;
}

然后我会创建数据对象的arraylist,如

ArrayList<Data> datas= new ArrayList<Data>();

将数据传递给自定义适配器以创建列表。有许多教程可供自定义适配器使用。

答案 1 :(得分:1)

尝试将值添加到类并访问它。这是一些片段

ContractTestActivity.java:

public class ContractTestActivity extends Activity {
private List<Contract> contracts = new ArrayList<Contract>();
public final String TAG = "ContractTest";
//public Contract newContract = new Contract();

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    ListView list;
    list = (ListView)findViewById(R.id.mylist);
    ArrayAdapter<Contract> adapter = new ContractAdapter(this, android.R.layout.simple_list_item_1, myContracts());
    list.setAdapter(adapter);
}

private List<Contract> myContracts(){

    List<Contract> list = new ArrayList<Contract>();

    list.add(new Contract("Friend1"));

    return list;
}

}

<强> Contract.java

public class Contract {

private String name;

public Contract(String name) {
    this.name = name;
}
public String getName() {
    return name;
}

}

<强> ContractAdapter.java

public class ContractAdapter extends ArrayAdapter<Contract> {


private List<Contract> contracts;

public ContractAdapter(Context context, int view, List<Contract> passedContracts) {
        super(context, view, passedContracts);
        contracts = passedContracts;
}

@Override
public int getCount() {
    return contracts.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View currentView = convertView;
        LayoutInflater currentViewInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        currentView = currentViewInflater.inflate(R.layout.deal_list, null);
        Contract currentContract = contracts.get(position);
        TextView text = (TextView) currentView.findViewById(R.id.text1);
        text.setText(currentContract.getName());
        return currentView;
}

}

对于Inflated Layout deal_list.xml:

使用文本视图创建布局,其中Id为text1。

试试这个,如果您发现任何困难,请告诉我。

感谢Venky ..

答案 2 :(得分:0)

如果我理解正确的话,3个ArrayLists的组合会出错吗?

也许这可以帮到你 https://github.com/commonsguy/cwac-merge

Android开发者网站上的Hello ListView教程 http://developer.android.com/resources/tutorials/views/hello-listview.html

答案 3 :(得分:0)

您可以使用BaseAdapter实现此行为。

您只需要自己处理getItem(),getCount()等方法,以便在为给定位置(来自正确的资源)获取项目时正确确定正确的源(列表或其他)。

另一方面,您可以创建一个元类,其中包含来自两个数据源的所需数据,并将该类的实例传递给适配器。