1

我有一个带有文本视图和复选框的列表视图。文本值存储在 HashMap 中。从数据库中检索数据。地图键是 ID,地图值是位置。当我将 HashMap 传递给适配器时,它从位置 0(零)开始打印。因此,我得到一个空文本(没有值)并错过了 HashMap 中的一个值(最后一个)。我不能使用 HashMap 作为数据源吗?

编辑:这是代码

public class LocationActivity extends Activity{

myAdapter myA;
Map<Integer,String> locLables;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.locationmain);

    ListView listview = (ListView) findViewById(R.id.listView1);

    String selectQuery = "SELECT  * FROM " + DatabaseHandler.TABLE_LOCATIONLABLES;
    SQLiteDatabase db = new DatabaseHandler(this).getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    locLables = new HashMap<Integer, String>();

    if(cursor != null){
        if (cursor.moveToFirst()) {
            do {

                locLables.put(new Integer(cursor.getString(0)),cursor.getString(1));
                System.out.println(cursor.getString(0)+"  "+ cursor.getString(1));
            } while (cursor.moveToNext());
        }
    }
    cursor.close();db.close(); 
    //System.out.println(locLables);
    myA = new myAdapter(this, locLables, listview);
    listview.setAdapter(myA);



    listview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            if(arg2 == 0 )
                arg2 = arg2+1;
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), locLables.get(arg2), Toast.LENGTH_SHORT).show();

        }
    });
}

这是适配器类

class myAdapter extends BaseAdapter{

ListView listView;
Activity cntx;
Map<Integer,String> locations;
List<Integer> locids = new LinkedList<Integer>();

public myAdapter(Activity context,Map<Integer,String> locLables, ListView lv){
    cntx = context;
    locations = locLables;
    listView = lv;
    System.out.println(locations);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return locations.size();
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View row=null;
    final int posi = position;

    LayoutInflater inflater=cntx.getLayoutInflater();
    row=inflater.inflate(R.layout.locationmain_entry, null);

    TextView tv = (TextView)row.findViewById(R.id.textView12);
    final CheckBox cb = (CheckBox)row.findViewById(R.id.checkBox12);

    if(locids.contains(posi))
        cb.setChecked(true);

    //here I get a null value as the first element and misses the last value..

        tv.setText(locations.get(position));

    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if(isChecked){
                System.out.println("Chedked" + posi+ locations.get(posi));
                //cb.setChecked(true);
                if(!locids.contains(posi))
                    locids.add(posi);
                //System.out.println(locids.get(posi));
            }else if(!isChecked){
                //cb.setChecked(false);
                if(locids.contains(posi))
                    locids.remove(new Integer(posi));
                System.out.println("NOt checked" +posi + locations.get(posi));
            }
        }
    });

    return row;
}

它针对 Map 中的元素数量运行。由于它使用 0(按位置变量),它也错过了最后一个值。

4

1 回答 1

0

你能做的是

ArrayList<Hashmap<Integer,String>> myList = new ArrayList<Hashmap<Integer,String>>();

 if(cursor != null){
    if (cursor.moveToFirst()) {
        do {
            locLables = new HashMap<Integer, String>();
            locLables.put(new Integer(cursor.getString(0)),cursor.getString(1));
            myList.add(locLables);
           } while (cursor.moveToNext());
    }
}
cursor.close();db.close(); 
myA = new myAdapter(this, myList, listview);
listview.setAdapter(myA);

您必须更改“myAdapter”适配器的构造函数以保存“ArrayList> myList”而不是“Map locLables”。

这将有所帮助......让我知道问题是否仍然存在......

于 2012-09-12T10:41:55.553 回答