Java Android Shared Prefs将键值映射到ArrayList到ListView行-已更新

Java Android Shared Prefs将键值映射到ArrayList到ListView行-已更新,java,android,arraylist,simpleadapter,Java,Android,Arraylist,Simpleadapter,以下是我想做的: -从SharedReferences对象(用户#,名称)检索键值对的映射 -将这些键值对写入ArrayList,以便 -使用它们填充包含键和值的每一行的ListView,如下所示: 用户1-乔R 用户2-弗兰克B 等 更新: 因此,在仔细研究SimpleAdapter类,并与一些更聪明、更有知识的人交谈之后——我比以前更接近了。。。但仍然不是一路走来 以下是我现在拥有的: public class LogHistory extends ListActivity { stat

以下是我想做的: -从SharedReferences对象(用户#,名称)检索键值对的映射 -将这些键值对写入ArrayList,以便 -使用它们填充包含键和值的每一行的ListView,如下所示:

  • 用户1-乔R

  • 用户2-弗兰克B


  • 更新: 因此,在仔细研究SimpleAdapter类,并与一些更聪明、更有知识的人交谈之后——我比以前更接近了。。。但仍然不是一路走来

    以下是我现在拥有的:

    public class LogHistory extends ListActivity {
    
    static final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    private static final String KEY = null;
    private static final String VALUE = null;
    
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.log_history);
    
        SharedPreferences logPrefs = getSharedPreferences(LoginField.PREFSNAME, 0);
        Map<String, ?> logMap = logPrefs.getAll();
    
        for (Map.Entry<String, ?> e : logMap.entrySet()) {
            HashMap<String, String> row = new HashMap<String, String>();
            String mKey = e.getKey();
            String mValue = (String) e.getValue();
            row.put(KEY, mKey);
            row.put(VALUE, mValue);
            list.add(row);
    
            // FOR DEBUGGING PURPOSES
            makeToast(mKey);
            makeToast(mValue);
        }
    
        SimpleAdapter adapter = new SimpleAdapter(
            this,
                list,
                R.layout.list_item,
                new String[] { KEY, VALUE },
                new int[] {R.id.item1, R.id.item2}
        );
    
        setListAdapter(adapter); 
    
    公共类日志历史扩展了ListActivity{
    静态最终ArrayList=新ArrayList();
    私有静态最终字符串密钥=null;
    私有静态最终字符串值=null;
    创建时的公共void(Bundle b){
    super.onCreate(b);
    setContentView(R.layout.log_历史);
    SharedReferences logPrefs=GetSharedReferences(LoginField.PREFSNAME,0);
    Map logMap=logPrefs.getAll();
    对于(Map.Entry e:logMap.entrySet()){
    HashMap行=新建HashMap();
    字符串mKey=e.getKey();
    字符串mValue=(字符串)e.getValue();
    row.put(键,mKey);
    row.put(值,mValue);
    列表。添加(行);
    //用于调试目的
    makeToast(mKey);
    makeToast(mValue);
    }
    SimpleAdapter适配器=新SimpleAdapter(
    这
    列表
    R.layout.list_项目,
    新字符串[]{KEY,VALUE},
    新int[]{R.id.item1,R.id.item2}
    );
    setListAdapter(适配器);
    
    这种方法很有效——但只起了一半作用……结果是,我得到了两列中的值列表

    但是,makeToast函数为键和值返回正确的值-因此问题一定出在SimpleAdapter方法yes

    帮助会很好-作业今晚就要交了!:-0

    您需要搜索“自定义listview”、“listview自定义适配器”等内容。“两行listview项目布局”

    看,谷歌上还有其他人

    基本上,您可以创建一个
    ArrayList
    ,它是您的数据容器。您可以根据需要向其中添加值,创建尽可能多的
    HashMap
    对象,并使用
    list.add(yourHashMap)
    ,其中list是ArrayList

    最后,您将其馈送到一个
    simpledapter
    (还有其他方法,但这不会带来太多麻烦)

    检查文档,看看每件事情是如何准确地工作的


    您正在清空索引键。请在最后的字符串中输入一个名称

    这种方法很有效——但只起了一半作用……结果是,我得到了两列中的值列表。。。 但是,makeToast函数为键和值返回正确的值-因此问题一定出在SimpleAdapter方法yes

    正如我所说,不。当你这样做:

    row.put(KEY, mKey);
    row.put(VALUE, mValue);
    
    您没有在
    之间提供有意义的区别,因为两者都是空的。这就像将所有内容放在同一列中一样

    您的推理错误是因为您自己创建的Toast测试只测试值的正确性,而不测试列:

    makeToast(mKey);
    makeToast(mValue);
    
    因为您只测试值。;)您假设列是正确的,错误可能只出现在值中,而值正好相反


    与计算机打交道的第一条规则:计算机永远不会假设LOL.;-)

    谢谢-SimpleAdapter是拼图中缺失的一块-我一直在拼命寻找ArrayAdapter、Forest for the trees等的解决方案。不客气!另一种方法是提供您自己的自定义适配器。一些东西比如:,这允许更好的控制和抽象。但是,如果你的需求不太高,我会从上面发布的内容开始。祝你好运!FWIW-我也发现这个链接很有用:这个链接的工作原理几乎与我第一次发布的内容完全相同,但概念完全相同。他将大量哈希映射输入列表(我给你提供了一个ArrayList,但不管怎样…)最后,他把所有这些都输入了一个SimpleAdapter。正如我所说,一模一样。-)所以-在花了大约最后一个小时的时间尝试完成这项工作之后,我想谷歌的某个地方的人对命名这个“SimpleAdapter”感到非常开心…;-pI更新了我的答案。在最后的字符串键中提供一个有意义的名称。索引“KEY”和“VALUE”