Android学习笔记(十二):ListView和GridView

来源:互联网 发布:视频编辑软件 慢动作 编辑:程序博客网 时间:2024/05/21 04:17
  • ListView一行一般只显示一条数据(当然也可以显示多条数据,但是比较麻烦),比如用来显示新闻列表;
  • GridView一行可以显示多条数据,比如图片的九宫格;
    这两者的用法基本相同,都是通过Adapter来添加数据。
  • 关于ListView一些常见的问题:
    • 在ListView中添加EditView组件时,EditView无法获取焦点,解决办法如下:
      • 在AndroidManifest.xml中你使用的Activity添加android:windowSoftInputMode=”adjustPan” />
      • ListView 布局文件 加入属性 android:descendantFocusability=”beforeDescendants”;其中beforeDescendants:viewgroup会优先其子类控件而获取到焦点
        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
    • 还是EditView的问题,上下滑动页面时,Editview中的数据会乱掉,解决办法如下:
      • 转自http://blog.csdn.net/xiaanming/article/details/8536231;
      • 大概思路就是:重新实现Adapter,然后在getView方法中,给EditView添加监听事件addTextChangedListener,然后将EditText的值存到一个HashMap,当页面刷新后再将HashMap中的值取出放到对应的EditView中即可
      • 下面是代码块Activity
    package com.xiaanming;      import java.util.ArrayList;      import java.util.HashMap;      import java.util.List;      import android.app.Activity;      import android.os.Bundle;      import android.text.Editable;      import android.text.TextWatcher;      import android.view.LayoutInflater;      import android.view.View;      import android.view.ViewGroup;      import android.widget.BaseAdapter;      import android.widget.EditText;      import android.widget.ListView;      public class ListViewActivity extends Activity {          private ListView listView;          private Adapter adapter;          List<String> dataList = new ArrayList<String>();          //定义一个HashMap,用来存放EditText的值,Key是position          HashMap<Integer, String> hashMap = new HashMap<Integer, String>();          /** Called when the activity is first created. */          @Override          public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.main);              //加入数据              dataList = addData();              //实例化ListView 并设置Adapter              listView = (ListView)findViewById(R.id.listView);              adapter = new Adapter();              listView.setAdapter(adapter);          }          //往ListView 里面添加数据的方法          private List<String> addData(){              List<String> list = new ArrayList<String>();              list.add("为你写诗");              list.add("我爱你");              list.add("傻瓜");              list.add("这就是爱");              list.add("我们在一起");              list.add("永远不分离");              list.add("想你的夜");              list.add("十年");              list.add("飞机场");              list.add("爱很简单");              list.add("普通朋友");              list.add("我们两");              list.add("富士三下");              list.add("离别");              list.add("们两");              return list;          }          //自定义Adapter          class Adapter extends BaseAdapter{              @Override              public int getCount() {                  return dataList.size();              }              @Override              public Object getItem(int position) {                  return dataList.get(position);              }              @Override              public long getItemId(int position) {                  return position;              }              @Override              public View getView(final int position, View convertView, ViewGroup parent) {                  String str = dataList.get(position);                  //下面这行,原文是R.layout.listview_item,但是他的布局中没有这个组件,应该是R.layout.listview                convertView = LayoutInflater.from(getApplication()).inflate(R.layout.listview, null);                  final EditText editText = (EditText)convertView.findViewById(R.id.editText1);                  editText.setText(str);                  //为editText设置TextChangedListener,每次改变的值设置到hashMap                  //我们要拿到里面的值根据position拿值                  editText.addTextChangedListener(new TextWatcher() {                      @Override                      public void onTextChanged(CharSequence s, int start, int before, int count) {                      }                      @Override                      public void beforeTextChanged(CharSequence s, int start,                               int count,int after) {                      }                      @Override                      public void afterTextChanged(Editable s) {                          //将editText中改变的值设置的HashMap中                          hashMap.put(position, s.toString());                      }                  });                  //如果hashMap不为空,就设置的editText                  if(hashMap.get(position) != null){                      editText.setText(hashMap.get(position));                  }                  return convertView;              }          }      }  
0 0
原创粉丝点击