ListView是在程序开发中经常要用到。在开发之中被用来做列表的设计实现。根据需求的列表中可能有很多数据,数据加载中原始的方法

    1.一次全部加载数据,这肯定很耗内存,也影响性能,更好的方法

    2.加载页面显示的数据,更优化的方法

    3.使用复用技术,加载页面的数据。



方法一的实现:在布局文件中加入视图

    布局文件activity_main.xml

    

        <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

            xmlns:tools="http://schemas.android.com/tools"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent" >

        

            <LinearLayout

                android:id="@+id/linearlayout"

                android:layout_width="fill_parent"

                android:layout_height="wrap_content"

                android:orientation="vertical" >

            </LinearLayout>

        

        </ScrollView>

    主程序MainActivity.java

         

            public class MainActivity extends ActionBarActivity {

            

             private LinearLayout layout ;

             private TextView textView;

             private List<Person> list;

             private ImageView  p_w_picpathView;

             @Override

             protected void onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

             setContentView(R.layout.activity_main);

                    

             layout = (LinearLayout)findViewById(R.id.linearlayout);

            

            

             list = addPerson();

                                //界面中显示多条数据

             for(int i = 0  ; i< 1000; i++){

             textView = new TextView(this);

             p_w_picpathView = new ImageView(this);

             p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);

             textView.setTextColor(Color.BLUE);

             textView.setText(list.get(i).toString());

                                    //    在LinearLayout中加入View

             layout.addView(p_w_picpathView);

             layout.addView(textView);

             }

            

             }

            

             private List<Person> addPerson() {

            

             List<Person> list1 = new ArrayList<Person>();

             Person person;

             for(int i = 0 ; i < 100000 ; i++){

             person = new Person("hhh", "zhangwwww", i);

             list1.add(person);

             }

             return list1;

             }

            }

     这个是简单列表简单的实现,Person类是个学生类包括name,info,age,三个字段。自定义了toString()方法,用于显示学生的姓名,信息和年龄。

    在测试中,当把循环次数增到很大的时候,不能全部加载出所有的项,超出的不会显示。性能是最低的。


方法二:在布局中加入view性能很低,我们用ListView控件实现系统给BaseAdapter,SimpleAdapter,ArrayAdapter等等。实现性能的优化。它是在通过页面显示的个数,调用getView方法多少次来绘制界面,滑动的时候在重绘。


    布局文件activity_main.xml

    

        <LinearLayout 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"

            android:orientation="vertical"

          >

            <ListView

                android:layout_width="fill_parent"

                android:layout_height="wrap_content"

                android:id="@+id/list"

               />

        

        </LinearLayout>

      主程序MainActivity.java

        public class MainActivity extends ActionBarActivity {

        

            private ListView listView;

            MyAdapter myAdapter;

            private List<Person> list;

            Button button;

            private int pressedId = -1;

         @Override

         protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.activity_main);

        

         listView = (ListView)findViewById(R.id.list);

         button = (Button)findViewById(R.id.button);

         list = getListData();

         myAdapter = new MyAdapter(this,list);

         listView.setAdapter(myAdapter);

         }

        

         private List<Person> getListData() {

         List<Person> list1  = new ArrayList<Person>();

         Person person;

         for(int i = 0 ; i < 100 ; i++){

         person = new Person("hhhh","ssss",i);

         list1.add(person);

         }

         return list1;

         }

        }

        

   MyAdapte是继承BaseAdapter的类,重写public View getView(int arg0, View arg1, ViewGroup arg2) 方法。在这个方法中设置ListView控件中每行要显示的数据。简单的实现:

        @Override

public View getView(int arg0, View arg1, ViewGroup arg2) {

//布局文件LinearLayout的id

linear = new LinearLayout(context);

//图片视图的ID

p_w_picpathView = new ImageView(context);

p_w_picpathView.setBackgroundResource(R.drawable.ic_launcher);

//加入到布局中

linear.addView(p_w_picpathView);

                

textView = new TextView(context);

textView.setTextColor(Color.BLUE);

textView.setText(person.get(arg0).toString());

linear.addView(textView);

                //返回视图

return linear;

}

方法三:是在方法二的基础上改进。加入了item布局文件,独立控件ID的获取,判断视图是否在内存中存在。

       item布局:

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

            xmlns:tools="http://schemas.android.com/tools"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:orientation="horizontal" 

            android:descendantFocusability="blocksDescendants">

    

            <ImageView

                android:id="@+id/imgView_1"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content" />

            <TextView android:id="@+id/textViewName_1"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                />

            <TextView android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:id="@+id/textViewInfo_1"></TextView>

            <Button

                android:id="@+id/load_1"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:background="@drawable/selector_bt_load"

                ></Button>

        </LinearLayout>

      ListView布局:

        <LinearLayout 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"

            android:paddingBottom="@dimen/activity_vertical_margin"

            android:paddingLeft="@dimen/activity_horizontal_margin"

            android:paddingRight="@dimen/activity_horizontal_margin"

            android:paddingTop="@dimen/activity_vertical_margin"

            tools:context="com.feiliu.fllistview_2.MainActivity$PlaceholderFragment" >

        

            <ListView 

                android:id="@+id/listView"

                android:layout_width="fill_parent"

                android:layout_height="wrap_content"

                ></ListView>

        

        </LinearLayout>

      在MyAdapter中加入独立获取控件的ID的方法.

        //view的声明在类的成员变量中声明

        public void getViewId(){

            

imgView_1 = (ImageView) convertView.findViewById(R.id.imgView_1);

        textViewName_1 = (TextView) convertView.findViewById(R.id.textViewName_1);

textViewInfo_1 = (TextView) convertView.findViewById(R.id.textViewInfo_1);

load_1 = (Button)convertView.findViewById(R.id.load_1);

     
        }

       在MyAdapter构造方法中调用一次,接下来是重写getView(int arg0, View arg1, ViewGroup arg2)方法。

        

        protected View getView(int position, View convertView) {

                //convertView是每一项的视图,判断是否为空,不为空就不重加载

if (convertView == null) {


        convertView = mLayoutInflater.inflate(getResourceId(), null);

    }

                   imgView_1.setBackgroundResource((Integer)arrayList.get(position).get("imgView"));

textViewName_1.setText((String)arrayList.get(position).get("imgName"));

textViewInfo_1.setText(arrayList.get(position).get("imgInfo").toString());

load_1.setText("下载");


return convertView;

}

      主程序MainActivity.java

        

public class MainActivity extends ActionBarActivity {


private ArrayList<HashMap<String, Object>> arrayList;

private ListViewAdapter<HashMap<String, Object>> listViewAdapter;

private ListView listView;

String[] imgNames = new String[] { "刀塔传奇", "群星斗地主", "二战前线", "剑圣传奇首发",

"消灭星星", "黄金矿工3", "放开那三国", "3D捕鱼达人", "全民打飞机", 

 };


String[] imgInfos = new String[] { "互动网游|128.1M", "×××桌游|5.5M", "飞行射击|5.3M",

"互动网游|90.1M", "休闲趣味|3.6M", "休闲趣味|7.5M", "互动网游|95.0M", "休闲趣味|26.6M",

"飞行射击|5.4M", " };


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.listview);


arrayList = getData();


listView = (ListView) findViewById(R.id.listView);

listViewAdapter = new ListViewAdapter<HashMap<String, Object>>(this, this.arrayList);


listView.setAdapter(listViewAdapter);


}


private ArrayList<HashMap<String, Object>> getData() {

ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> map;


for (int j = 0; j < 9; j++) {

map = new HashMap<String, Object>();

map.put("imgView", R.drawable.ic_launcher);

map.put("imgName", imgNames[j * 3]);

map.put("imgInfo", imgInfos[j * 3]);


map.put("imgView1", R.drawable.ic_launcher);

map.put("imgName1", imgNames[j * 3 + 1]);

map.put("imgInfo1", imgInfos[j * 3 + 1]);


map.put("imgView2", R.drawable.ic_launcher);

map.put("imgName2", imgNames[j * 3 + 2]);

map.put("imgInfo2", imgInfos[j * 3 + 2]);

arrayList.add(map);

}


return arrayList;

}

}

    ListView在开发中占的比重还是很重的。本人也是初学,有什么不当的请谅解。