2015-04-21 1 views
0

Я использую два адаптера списка, как показано на рисунке ниже. resultList и resultList2 инициализируются new ArrayList <HashMap<String,String>>();Совет по android setlistadapter и объединение двух макетов .xml

ListAdapter adapter, adapter2; 
adapter =new SimpleAdapter(
       getActivity(), resultList, 
       R.layout.list_item1, new String[]{TAG_ID, TAG_FRUIT, TAG_SPECIES}, 
       new int[]{R.id.Id,R.id.fruit,R.id.species}); 
adapter2=new SimpleAdapter(
       getActivity(), resultList2, 
       R.layout.list_item_append, new String[]{ TAG_NAME, TAG_ADDRESS, TAG_EMAIL}, 
       new int[]{ R.id.name, R.id.address, R.id.email}); 
setListAdapter(adapter); 
setListAdapter(adapter2); //this line has overriden setListAdapter(adapter) 

У меня есть две раскладки с именем list_item1.xml и list_item2.xml.

//list_item.xml 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

    <TextView 
     android:id="@+id/Id" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" 
     android:descendantFocusability="blocksDescendants" 
     android:visibility="gone"/><!--android:visibility="gone" --> 

    <TextView 
     android:id="@+id/fruit" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/species" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" /> 
</LinearLayout> 

второй макет: list_item2.xml
list_item.xml

<TextView 
    android:id="@+id/name" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="6dip" 
    android:paddingLeft="6dip" 
    android:textSize="17sp" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/address" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="6dip" 
    android:paddingLeft="6dip" 
    android:textSize="17sp" 
    android:textStyle="bold" /> 

<TextView 
    android:id="@+id/email" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="6dip" 
    android:paddingLeft="6dip" 
    android:textSize="17sp" 
    android:textStyle="bold" /> 

Я пытался использовать <include> и <merge> в моем новом макете, но это не то, чего я хотел. Результат отображает все элементы в адаптере2. Но перед каждым элементом адаптера2 есть пустой элемент списка.

Мой ожидаемый результат являются:
адаптер ....
адаптер ....
адаптер ...
adapter2 ...
adapter2 ...
adapter2 ...

Как могу ли я достичь этого? Я думаю, что setListAdapter является причиной проблемы.

Причина, по которой я использовал два listadapter, заключается в том, что я пытаюсь выполнить два набора двух данных из моей базы данных. Данные извлекаются из таблицы с именем tblfruit и tblperson.

$response["results"] = array(); 
    $response["results2"] = array(); 
    // temp user array 
    $results = array(); 
    $results2=array(); 

    while ($row = mysql_fetch_array($result)){ 
     $results["id"] = $row["id"]; 
     $results["fruit"] = $row["fruit"]; 
     $results["species"] = $row["species"]; 
     array_push($response["results"], $results); 
    } 
    while ($row = mysql_fetch_array($result2)){ 
     $results2["name"] = $row["name"]; 
     $results2["address"] = $row["address"]; 
     $results2["email"] = $row["email"]; 
     array_push($response["results2"], $results2); 
    } 
+0

Используйте два разных вида ListView для двух разных адаптеров. –

+1

Используйте один и тот же список (только один список) только с одним адаптером, а внутри адаптера используйте тип элементов и вызовите макет, который вам нужен для каждого элемента. – xanexpt

+0

привет, дхаваль и привет bmarqes. Я отредактировал свой вопрос. Пожалуйста, посмотрите спасибо. – Aroma88

ответ

0

Протяните ListAdapter и раздуйте каждый ряд с желаемым расположением в пределах метода адаптера View.getView(). Этот метод вызывается один раз для каждой строки в ListView (или записи внутри адаптера, если вы хотите быть конкретным). Он используется для настройки (или, ну, надувания) вида для каждой записи и выполнения таких действий, как установка значения TextView, ImageView, скрытие ненужных компонентов для каждой строки и т. Д. Я не пробовал это с двумя разными ресурсами макета, но я полагаю, что это можно сделать с помощью этого подхода.

public class CustomListAdapter extends ArrayAdapter<CustomObject> { 

    private Context context; 
    private int layoutResourceId_1; 
    private int layoutResourceId_2 
    private List<CustomObject> list; 

    public CustomListAdapter(Context context, int layoutResourceId_1, int layoutResourceId_2, List<CustomObject> list) { 
     super(context, layoutResourceId_1, list); 
     this.context = context; 
     this.layoutResourceId_1 = layoutResourceId_1; 
     this.layoutResourceId_2 = layoutResourceId_2; 
     this.list = list; 
    } 

    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater(); 

     if(condition_layout_1()) { 
      row = layoutInflater.inflate(layoutResourceId_1, parent, false); 
      // Use a holder to prepare item 
      ... 
     } else { 
      row = layoutInflater.inflate(layoutResourceId_2, parent, false); 
      // Use a holder to prepare item 
      ... 
     } 

     return row; 
    } 

    ... 
} 
+0

привет, судороги. Я использовал ту же концепцию, что и упомянутое решение. Это работает! Благодарю. – Aroma88

+0

Нет проблем. Примите этот ответ, если это поможет. Удачи! – Cramps

0

Вам не нужно объединить list_item1 и resultList2 макеты для все, что вы пытаетесь achieve.Instead расширения ListActivity или ListFragment, использовать обычную деятельность и setContentView с макетом, который имеет два ListViews в XML как ниже

<?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:gravity="center" 
android:orientation="vertical" > 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" > 
</ListView> 

<ListView 
    android:id="@+id/listView2" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" > 
</ListView> 

, а затем в файле Java

ListView listview1 = (ListView) findViewById(R.id.listView1); 
    ListView listview2 = (ListView) findViewById(R.id.listView2); 
    listview1.setAdapter(adapter); 
    listview2.setAdapter(adapter2); 

Я не уверен, соответствует ли это вашим требованиям. Обратитесь, если это не так. Я надеюсь, что это поможет.

+0

привет, дора. спасибо за ваш ответ, и я очень ценю это. =) Я попытался использовать этот подход, но это не тот результат, которого я хотел. Еще раз спасибо. – Aroma88