ListView列表样式

时间:2014-03-18 13:24:14

标签: android listview

是否可以改变"样式"列表视图一旦显示?我想要做的是使用simple_list_item_1从列表视图开始,但在填充列表后切换到simple_list_item_multiple_choice。

如果这不可能,有人可以告诉我如何使用文本视图和复选框填充列表视图,因为我发现这很难理解。

一如既往,提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果两个视图" simple_list_item_multiple_choice"和" simple_list_item_1"根据复选框的不同,您只需使用" simple_list_item_multiple_choice"您可以在启动时隐藏复选框,加载数据时可以使复选框可见。或者你可以在加载数据时显示一个活动指示器,加载数据后你可以直接移植自定义ListView,认为这个更好。一些示例代码提供了解释。

首先是listView的自定义适配器。此适配器适用于ListView的每个项目。

//Custom Adapter
private class DataAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        if (channelListTitles.size()>0){
            return dataArrayList.size(); //dataArrayList is a ArrayList<String>
        }
        else {
            return 0;
        }
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView==null){
            convertView = getActivity().getLayoutInflater().inflate(R.layout.item_view,null); //item_view is the custom view for the items of the ListView
        }
        if (convertView != null) {
            ((TextView)convertView.findViewById(R.id.item_view_title)).setText(channelListTitles.get(position)); //item_view_title is the TextView

            if(isDataLoaded){ //isDataLoaded is a bool value to indicate if data is loaded
                CheckBox checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
                checkBox.setVisibility(View.VISIBLE);
            }
        }

        return convertView;
    }
}

现在每个列表项的item_view:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/checkbox"
    android:visibility="invisible"/>
    <TextView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:id="@+id/item_view_title"
        android:layout_gravity="center_vertical"/>
</LinearLayout>

现在最后声明一个listView,其中将移植上部自定义视图。发布OnCreateView()的完整代码以便更好地理解。在这里我使用Fragment,如果您使用Activity,则需要更改相应的方法:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    if (rootView != null) {
        ListView listView = (ListView) rootView.findViewById(R.id.item_list);
        DataAdapter itemDataAdapter = new DataAdapter();
        listView.setAdapter(itemDataAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // OnItemClickListener goes here
            }
        });
    }
    return rootView;
}

现在是fragment_main:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity$PlaceholderFragment">

<ListView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:id="@+id/item_list"/>
</RelativeLayout>

当您想要动态加载数据时,适配器是一个重要因素。基本上,适配器是数据和视图之间的桥梁。获得数据后,您可以使用itemDataAdapter.notifyDataSetChanged();调用适配器来更新视图。

答案 1 :(得分:0)

是的,你可以这样做,你需要为行创建一个xml。并创建一个适配器类并覆盖getView()并在此处膨胀视图。我总是扩展BaseAdapter。

答案 2 :(得分:0)

@ adelphia,我想使用自定义列表视图。 Follow this tutorials for custom list view(遵循72-84个教程)。