Android ListFragment重叠

时间:2015-10-05 17:44:25

标签: java android listview android-listfragment

我正在学习Android开发,我被困在Fragments。我已经阅读了教程点书和一些Android开发者文档,所以下一步是为我的手机构建一个应用程序。

我正在尝试制作购物清单。当您启动应用程序时,会显示一个菜单,它会显示三个选项,有问题的选项是第三个选项。

这个想法是允许用户创建更新并从该列表中删除产品。

所以这就是我到目前为止所做的事情

product_crud.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="116dp">

    <EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/name_txt"
    android:hint="@string/product_name"
    android:inputType="text"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_add"
        android:paddingLeft="10px"
        android:text="@string/add_product"
        android:layout_below="@+id/name_txt"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/android:list"
    android:layout_below="@+id/btn_add"
    android:layout_alignParentStart="true" />

</LinearLayout>

crudrowlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="10px"
>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn_delete"
    android:text="@string/remove_product"
    android:layout_gravity="right"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text_name"
    android:textSize="40px"
    android:layout_alignTop="@+id/btn_delete"
    android:layout_alignParentStart="true"
    android:layout_alignBottom="@+id/btn_delete" />


 </RelativeLayout>

PM_List_Fragment

public class PM_List_Fragment extends ListFragment {

ProductsDataSource products;

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    products = new ProductsDataSource(getActivity());
    try {
        products.open();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    CrudArrayAdapter crudArrayAdapter = new CrudArrayAdapter(getActivity(),products.getAllProducts());
    products.close();
    setListAdapter(crudArrayAdapter);
}
}

适配器

public class CrudArrayAdapter extends ArrayAdapter<Product> {

private final List<Product> list;
private final Activity context;

static class ViewHolder{
    protected TextView name;
    protected Button delete;
}


public CrudArrayAdapter(Activity context,List<Product> list) {
    super(context, R.layout.rowlayout,list);
    this.list = list;
    this.context = context;
}


@Override
public View getView(int position,View convertView,ViewGroup parent){
    View view;
    if(convertView == null){
        LayoutInflater inflater = context.getLayoutInflater();
        view = inflater.inflate(R.layout.crudrowlayout,null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.name = (TextView)view.findViewById(R.id.text_name);
        viewHolder.delete = (Button)view.findViewById(R.id.btn_delete);
        view.setTag(viewHolder);
    }else{
        view = convertView;
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.name.setText(list.get(position).getName());
    return view;
}


}

和我的活动

public class CrudProducts extends ListActivity {

private String msg = "Android: ";
private ProductsDataSource productsDataSource;


@Override
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
  //  ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
    setContentView(R.layout.product_crud);

    PM_List_Fragment pm_list_fragment = new PM_List_Fragment();

    FragmentManager fragmentManager = getFragmentManager();

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.add(android.R.id.content,pm_list_fragment);

    Button btn_add = (Button)this.findViewById(R.id.btn_add);

    btn_add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //create a form or put some input text so we can update the db!
            EditText editText = (EditText)findViewById(R.id.name_txt);
            if(editText.getText().length() > 0 && !productsDataSource.exists(editText.getText().toString())){
                Product prod = productsDataSource.createProduct(editText.getText().toString());
             //   adapter.add(prod);

            }else{
            if(editText.getText().length() == 0 )
            {
                Toast.makeText(getApplicationContext(),"Please insert a name",Toast.LENGTH_LONG).show();
            }
            else{
                Toast.makeText(getApplicationContext(),"This product already exists",Toast.LENGTH_LONG).show();
                }
            }
          //  adapter.notifyDataSetChanged();
        }
    });

    fragmentTransaction.commit();
}

}

不要担心数据源或适配器,这里的问题是ListViewEditTextButton (deleteBtn)重叠。 列表视图显示在EditTextButton上方。我试图以不同的方式改变布局,但没有一个工作。

我已经读过您可以使用普通活动和ListView实现相同的功能,但我想学习如何这样做。

一些想法?

问题图片:

Problem overlap

2 个答案:

答案 0 :(得分:1)

我注意到有一些事情可能对你有帮助!

首先,CrudProducts extends ListActivityPM_List_Fragment extends ListFragment。如果您打算显示列表,则应仅依赖ListFragment。您可以将CrudProducts扩展为Activity

如果您这样做,可以使用CrudProducts

setContentView(R.layout.crud_activity)设置以下布局

<强> crud_activity.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" >

    <FrameLayout
        android:id="@android:id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>

</LinearLayout>

其次,在您的片段PM_List_Fragment添加

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.product_crud, container, false);
    return view;
}

第三, product_crud.xml 还需要一些改进

由于<ListView>的父级不是RelativeLayout

,您的ListView不需要以下属性
android:layout_below="@+id/btn_add"
android:layout_alignParentStart="true"

您的孩子也不需要RelativeLayout

android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"

而是尝试将Button设为match_parent

<Button
    android:id="@+id/btn_add"
    android:layout_width="match_parent"

还可以在Button

中为dp尝试平衡填充
android:paddingLeft="10dp"
android:paddingRight="10dp"

上面应该解决您的问题,列表应该正确显示。

答案 1 :(得分:0)

您的主视图是LinearLayout,请尝试将其更改为RelativeLayout。 你应该这样试试:

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

    <RelativeLayout
        android:layout_alignParentTop="true"
        android:id="@+id/buttonView"
        android:layout_width="match_parent"
        android:layout_height="116dp"
        android:orientation="vertical">

        <EditText
            android:id="@+id/name_txt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:inputType="text" />

        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/name_txt"
            android:paddingLeft="10px"
          />

    </RelativeLayout>

    <ListView
        android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/buttonView" />

</RelativeLayout>

将导致此:

enter image description here