2016-01-22 141 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)行号偶数尽管这些空字符串是在不同的布局中使用。所以它不太方便,特别是当你想显示这么多的数据。如果这里的某个人拥有比这更简单的方法。随时与我/我们分享。我渴望学习。谢谢!

相关问题