Adapter:关于id和position的实验

结果 1 AdapterView OnItemClickListener 行单击事件中:
P osition 代表在 AdapterView 中的 行位置 (包括 header ),从 0 开始,获取数据还是使用 parent.getItemAtPosition(position)
I d 代表 adapter 数据源的第几条数据 ,从 0 开始, header 行的 id=-1 ,所以也可以用 list.get(id) list.remove(id) 来操作数据集中的数据
 
代码:见 “附代码 1
实验截图:


结果 2 BaseAdapter getView() 中的 position 代表 adapter 数据源的第几条数据 ,从 0 开始。
所以获取数据可以使用 list (数据源) .get(position) ;或者使用你覆写的 getItem(position) 方法
代码:见 “附代码 2
实验截图:

附代码1

public class MainActivity extends Activity {
    public TextView tv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView)findViewById(R.id.listView);
        tv = (TextView)findViewById(R.id.tv);
        View layout1 = getLayoutInflater().inflate(R.layout.list_item, null);
        TextView head_tv1 = (TextView)layout1.findViewById(R.id.tv_classifyName);
        head_tv1.setText("header1");
        head_tv1.setTag(-1);
        lv.addHeaderView(layout1);
        View layout2 = getLayoutInflater().inflate(R.layout.list_item, null);
        TextView head_tv2 = (TextView)layout2.findViewById(R.id.tv_classifyName);
        head_tv2.setText("header2");
        head_tv2.setTag(-2);
        lv.addHeaderView(layout2);
        List<Map<String, String>> list = getData();
        SimpleAdapter ada = new SimpleAdapter(this, list, R.layout.list_item,
        new String[]{"title"}, new int[]{R.id.tv_classifyName});
        lv.setAdapter(ada);
 
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
                // TODO Auto-generated method stub
                if(id == -1) {               
                    String str = "position: " + position + "    id: " + id;
                    tv.setText(str);
                } else {
                    String str = "position: " + position + "    id: " + id;
                    Map<String, String> map1 = (Map<String, String>)parent.getItemAtPosition(position);
                    str = str + "\ngetItembyPosition: " + map1.get("title");
                    tv.setText(str);
                }
            }
        });
    }
 
    public ArrayList<Map<String, String>> getData() {
        ArrayList<Map<String, String>> list = new ArrayList<Map<String,String>>();
        for(int i = 0; i < 20; i++) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("title", i + " " + i);
            list.add(map);
        }
    return list;
    }
}
附代码 2
MainActivity .java:


public class MainActivity extends Activity {
public static TextView tv;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView lv = (ListView)findViewById(R.id.listView);
    tv = (TextView)findViewById(R.id.tv);
    View layout1 = getLayoutInflater().inflate(R.layout.list_item, null);
    TextView head_tv1 = (TextView)layout1.findViewById(R.id.tv_classifyName);
    head_tv1.setText("header1");
    head_tv1.setTag(-1);
    lv.addHeaderView(layout1);
    View layout2 = getLayoutInflater().inflate(R.layout.list_item, null);
    TextView head_tv2 = (TextView)layout2.findViewById(R.id.tv_classifyName);
    head_tv2.setText("header2");
    head_tv2.setTag(-2);
    lv.addHeaderView(layout2);
    List<Map<String, String>> list = getData();
    adapter ada = new adapter(this, list);
    lv.setAdapter(ada);
}
 
    public ArrayList<Map<String, String>> getData() {
        ArrayList<Map<String, String>> list = new ArrayList<Map<String,String>>();
        for(int i = 0; i < 20; i++) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("title", i + " " + i);
            list.add(map);
        }
        return list;
    }
}
 

Adapter.java:

public class adapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;
private List<Map<String, String>> list;
 
public adapter(Context context, List<Map<String, String>> list) {
    // 获得LayoutInflater的实例
    this.context = context;
    layoutInflater = LayoutInflater.from(context);
    this.list = list;
}
 
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return list.size(); // 返回列表长度
}
 
@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return list.get(arg0);// 返回该位置的Map<>
}
 
@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}
 
public final class ViewHolder {
    public TextView tv;
    public Button btn;
}
 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // 设置/获取holder
    ViewHolder holder = null;
    if (convertView == null) {
        // convertView表示某一行的view布局,是已经inflate了的布局
        convertView = layoutInflater.inflate(R.layout.list_item,
        null);
 
        // 实例化holder中的weight
        holder = new ViewHolder();
        holder.tv = (TextView) convertView.findViewById(R.id.tv_classifyName);
        holder.btn = (Button) convertView.findViewById(R.id.btn);
 
        // 给convertView绑定一个额外数据,把ViewHolder缓存起来,方便下次可以getTag()获得该view,直接重用
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
 
    // 把holder中的控件与List<>数据源对应起来,即与Map中的key字段对应
    final int p = position;
    holder.tv.setText(list.get(position).get("title"));
    holder.btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String str = "position: " + p + "\nlist.get(p).get('XX'): " + list.get(p).get("title");
            MainActivity.tv.setText(str);
        }
    });
    return convertView;
    }
 
}


猜你喜欢

转载自blog.csdn.net/Mario_faker/article/details/79618182
今日推荐