2016-01-22 84 views
1

我想在一個ListView中組合兩個LinearLayout,它們都有不同的TextView排列。所以最後一下應該有如下:如何在同一個ListView中創建兩個不同的LinearLayout?

enter image description here

,我和我的代碼運行,但應用程序將無法啓動。以下是我的代碼。

Activity類

public class MainActivity extends Activity { 

    // Create list of items 
    String[] publicModeItems = { 
      "AAAAA", 
      "BBBBB" 
    }; 

    String[] publicModeParameters = { 
      "YES", 
      "NO" 
    }; 

    String[] publicModeResetExe = { 
      "CCCCC", 
      "DDDDD" 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     populateListView(); 
    } 

    private void populateListView() { 

     CustomList adapter1 = new CustomList(this, publicModeItems, publicModeParameters); 

     // Build adapter 
     ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(
       this,      // context for the activity 
       R.layout.text_view_test, // layout to use (create) 
       publicModeResetExe);  // items to display 

     // Configure the list view 
     ListView list = (ListView) findViewById(R.id.PublicModeListView); 
     list.setAdapter(adapter1); 
     list.setAdapter(adapter2); 
    } 

    private class CustomList extends ArrayAdapter<String> { 
     private final Activity context; 
     private final String[] publicModeItems; 
     private final String[] publicModeParameters; 

     public CustomList(Activity context, 
       String[] publicModeItems, 
       String[] publicModeParameters) { 
      super(context, R.layout.text_views_1, publicModeItems); 
      this.context = context; 
      this.publicModeItems = publicModeItems; 
      this.publicModeParameters = publicModeParameters; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 

      LayoutInflater layoutinflater = context.getLayoutInflater(); 
      View rowView = layoutinflater.inflate(R.layout.text_views_1, null, true); 
      TextView txtPublicModeItems = (TextView) rowView.findViewById(R.id.PublicModeItems); 
      TextView txtPublicModeParameters = (TextView) rowView.findViewById(R.id.PublicModeParameters); 
      txtPublicModeItems.setText(publicModeItems[position]); 
      txtPublicModeParameters.setText(publicModeParameters[position]); 

      return rowView; 
     } 
    } 
} 

text_views_1 XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/PublicModeLayoutForTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/PublicModeItems" 
     android:layout_width="200sp" 
     android:layout_height="wrap_content" 
     android:textColor="@drawable/text_color_change" /> 

    <TextView 
     android:id="@+id/PublicModeOpenBracket" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="[" 
     android:textColor="@drawable/text_color_change" /> 

    <TextView 
     android:id="@+id/PublicModeParameters" 
     android:layout_width="100sp" 
     android:layout_height="wrap_content" 
     android:gravity="end" 
     android:textColor="@drawable/text_color_change" /> 

    <TextView 
     android:id="@+id/PublicModeCloseBracket" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="]" 
     android:textColor="@drawable/text_color_change" /> 

</LinearLayout> 

text_view_test XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:textColor="@drawable/text_color_change" > 

</TextView> 

activity_main XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/PublicModeListViewLayout01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/black" 
    android:baselineAligned="true" 
    android:orientation="vertical" 
    tools:context="com.example.mycalendar.MainActivity" > 

    <LinearLayout 
     android:id="@+id/PublicModeListViewLayout02" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:background="@drawable/custom_border" 
     android:padding="5dp" > 

     <ListView 
      android:id="@+id/PublicModeListView" 
      android:layout_width="308dp" 
      android:layout_height="wrap_content" 
      android:choiceMode="singleChoice" 
      android:listSelector="@color/yellow" 
      android:smoothScrollbar="true" > 

     </ListView> 

    </LinearLayout> 
</LinearLayout> 

問題:我只是我的代碼運行剛纔,只有 'CCCCC' 和 'DDDDD' 顯示的是。所以你有什麼想法嗎?

+0

什麼是錯誤? –

+0

哦對不起!我剛剛運行我的代碼,只顯示'CCCCC'和'DDDDD'。所以你有什麼想法嗎? –

+0

不需要2個適配器,您可以綁定'ArrayList'中的所有數據並將其傳遞給適配器。 –

回答

1
  1. 您應該BaseAdapter而不是ArrayAdapter繼承您的列表適配器。

  2. 重寫適配器的getView()方法根據位置膨脹佈局,如下所示。

public View getView(int position, View convertView, ViewGroup parent) { 
    ... 
    View rootView = null; 
    if (position == 0 || position == 1) { 
     rootView = layoutinflater.inflate(R.layout.text_views_1, null, true); 
    } else { 
     rootView = layoutinflater.inflate(R.layout.text_views, null, true); 
    } 
    ... 
    return rootView; 
} 
+0

嘿,我嘗試了你的建議,但BaseAdapter迫使我實現了'public int getCount()','public Object getItem()'和'public long getItemId()'的未實現方法。對於getCount,我應該返回什麼值? 還有一件事是,爲什麼你的位置條件是'0 || 1'? –

+0

getCount()是您列表視圖的總行數。 0,1的位置條件是基於你的問題截圖。你需要決定哪一行返回哪個視圖。 –

+0

這意味着,對於上面的圖片,我需要爲'getCount()'返回4'嗎? –

0

您設置列表適配器在這種情況下兩次

list.setAdapter(adapter1); 
list.setAdapter(adapter2); 

最新的適配器是第二,不是他們兩個。
使用ListViewSimpleAdapter或自定義適配器,這將解決所有的問題,看看這個爲SimpleAdaptertutorial學習的基礎知識,這tutorial來了解如何讓多個視圖,而不是僅僅1.本 tutorial是創造自定義適配器 順便說一句,我對你的代碼和XML佈局幾點意見
首先,沒有必要爲2只TextView爲了你們的支架,你可以很容易地通過編程將它們添加到String[]甚至YES/NO TextView
第二個,您在CustomList適配器中沒有使用ViewHolder,這不是一個好習慣,因爲每次滾動列表時,它都會創建新視圖,儘管它可以使用已存在的視圖。

0

我已經解決了這個問題。但使用這種方法似乎不太方便。

public class PublicModeActivity extends Activity { 

    // Create list of items 
    String[] publicModeItems = { 
      "AAAAA", 
      "BBBBB" 
    }; 

    String[] publicModeParameters = { 
      "YES", 
      "NO" 

    String[] publicModeResEx = { 
      "", 
      "", 
      "CCCCC", 
      "DDDDD" 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     populateListView(); 
    } 

    private void populateListView() { 

     CustomList adapter = new CustomList(this, publicModeItems, publicModeParameters, publicModeResEx); 

     // Configure the list view 
     ListView list = (ListView) findViewById(R.id.PublicModeListView); 
     list.setAdapter(adapter); 
    } 

    private class CustomList extends BaseAdapter { 
     private final Activity context; 
     private final String[] publicModeItems; 
     private final String[] publicModeParameters; 
     private final String[] publicModeResEx; 

     public CustomList(Activity context, 
       String[] publicModeItems, 
       String[] publicModeParameters, 
       String[] publicModeResEx) { 
      super(); 
      this.context = context; 
      this.publicModeItems = publicModeItems; 
      this.publicModeParameters = publicModeParameters; 
      this.publicModeResEx = publicModeResEx; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 

      LayoutInflater layoutinflater = context.getLayoutInflater(); 
      View rowView = null; 
      Log.i("PublicModeActivity", "" + position); 
      if (position < 2) { 
       rowView = layoutinflater.inflate(R.layout.text_views_1, null, true); 
       TextView txtPublicModeItems = (TextView) rowView.findViewById(R.id.PublicModeItems); 
       TextView txtPublicModeParameters = (TextView) rowView.findViewById(R.id.PublicModeParameters); 
       txtPublicModeItems.setText(publicModeItems[position]); 
       txtPublicModeParameters.setText(publicModeParameters[position]); 
      } else { 
       rowView = layoutinflater.inflate(R.layout.text_view_test, null, true); 
       TextView txtPublicModeResEx = (TextView) rowView.findViewById(R.id.PublicModeResEx); 
       txtPublicModeResEx.setText(publicModeResEx[position]); 
      } 
      return rowView; 
     } 

     @Override 
     public int getCount() { 
      return 4; 
     } 

     @Override 
     public Object getItem(int position) { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 
    } 
} 

我需要把那個空字符串"",,以配合上佈局(text_views_1)行號偶數儘管這些空字符串是在不同的佈局中使用。所以它不太方便,特別是當你想顯示這麼多的數據。如果這裏的某個人擁有比這更簡單的方法。隨時與我/我們分享。我渴望學習。謝謝!

相關問題