ListView仅显示列表中的第一项

时间:2015-10-31 17:45:30

标签: android android-layout listview android-arrayadapter

我经常搜索答案,但找不到适合我的答案。 我发现当我将layout_heigh设置为500dp时 - >显示的所有项目,但是当它具有正常大小(layout_heigh = wrap_content)时,则仅显示第一个项目。

这是我的代码:

activity_main.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:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="Add Task"
        android:onClick="addTask" />

    <ListView android:id="@+id/myListView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false"/>

</LinearLayout>

xml_item.xml:这是一个要在listView中复制的项目

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:id="@+id/itemText"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:padding="15dp"
        android:textSize="20sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/doneBtn"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:text="Done" />


</RelativeLayout>

MyListAdapter: main_activity中一个扩展ArrayAdapter类的类,因此我可以将TextView和一个按钮放在一行。

private class MyListAdapter extends ArrayAdapter<String> {

        private int layout;

        public MyListAdapter(Context context, int resource, List<String> objects) {
            super(context, resource, objects);
            layout= resource;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder mainHolder= null;
            if (convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(getContext());
                convertView= inflater.inflate(layout, parent, false);
                ViewHolder viewHolder= new ViewHolder();
                viewHolder.item= (TextView) convertView.findViewById(R.id.itemText);
                viewHolder.btn= (Button) convertView.findViewById(R.id.doneBtn);
                viewHolder.btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getContext(), itemArray.get(position), Toast.LENGTH_SHORT).show();
                    }
                });
                convertView.setTag(viewHolder);
            }
            else {
                mainHolder= (ViewHolder) convertView.getTag();
                mainHolder.item.setText(getItem(position));
            }

            return convertView;
        }

        public class ViewHolder {
            TextView item;
            Button btn;
        }
    }

谢谢大家! :)

2 个答案:

答案 0 :(得分:0)

  

但是它的大小正常(layout_heigh = wrap_content)

通过给ListView height=wrap_content来使用getView()是一个非常糟糕的主意 这会强制ListView在布局时测量适配器中的几个孩子,以了解它应该有多大 你可以自己调试适配器里面的LinearLayout方法。

在您的情况下,使用layout_heigh=match_parent只需在列表视图中添加一个上边距(按钮为50dp)并使用RelativeLayout
否则请使用[DIOSUser userLoginWithUsername:_userField.text andPassword:_passField.text success:^(AFHTTPRequestOperation *op, id response) { // Saving to keychain/NSUserDefaults [[NSUserDefaults standardUserDefaults] setObject:[[DIOSSession sharedSession] user] forKey:@"diosSession"]; [[NSUserDefaults standardUserDefaults] synchronize]; [[DIOSSession sharedSession] getCSRFTokenWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *csrfToken = [NSString stringWithUTF8String:[responseObject bytes]]; [[NSUserDefaults standardUserDefaults] setObject:csrfToken forKey:@"diosToken"]; [[NSUserDefaults standardUserDefaults] synchronize]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // failure handler }]; wrongLogin.hidden = YES; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MyAccountViewController *yourViewController = (MyAccountViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MyAccount"]; [self.navigationController pushViewController:yourViewController animated:YES]; [self.activityIndicatorViewOne stopAnimating]; self.activityIndicatorViewOne.hidden = YES; NSLog(@"Success!");} failure:^(AFHTTPRequestOperation *op, NSError *err) { NSLog(@"Fail!"); wrongLogin.hidden = NO; } ]; }

答案 1 :(得分:0)

更改列表视图以占用尽可能多的空间,可以考虑任何兄弟视图的高度(在本例中为您的按钮)。以下是使用android:layout_weight属性

的方法
<?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:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="Add Task"
        android:onClick="addTask" />

    <ListView android:id="@+id/myListView"
              android:layout_width="wrap_content"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:drawSelectorOnTop="false"/>

</LinearLayout>