关于listview:如何使用将ArrayList >中的数据插入Android Studio中的列表视图中

How to use insert data from ArrayList> into a list view in Android Studio

我正在研究一个从远程服务器上的数据库获取查询的项目。它的SQL端从两个单独的表中获取信息,将它们组合在一起并向我发送JSON编码的字符串。然后,我解析该字符串并创建一个HashMap为String的ArrayList,其中String用于保存数据。所有这些都很好。有108个条目,所有相关变量都显示了这一点。

当我尝试将最终的ArrayList HashMap放入listView时,出现了我的问题。我创建了一个自定义布局,在使用dataprovider类和自定义适配器从一组数组中填充该布局时,我知道该布局有效。

我按照一个教程为ArrayList HashMap(http://techlovejump.com/android-multicolum-listview/)创建自定义适配器。它似乎可以正常工作,只是它只会从ArrayList HashMap中提取10-12个项目,然后重复。列表中确实有108个项目。我注意到,当我滚动列表时,列表中紧靠屏幕的第一项会更改为其他项。

我已经调试了自定义适配器类中的代码,并且一切正常,位置从0开始并上升。我通常看到它一次到达10,一次或两次12。这时,下一次通过getView方法,该位置返回到0,并且重新开始。

我只是在学习所有这些,可能做错了什么,只是不知道是什么。这是我必须调用自定义适配器类和类本身的代码。

从分析我的JSON字符串并构建原始ArrayList HashMap的方法中调用的自定义适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by jokerfwb on 11/12/15.
 */
public class UsersmyListAdapter extends BaseAdapter {

    private static final String TAG_NAME ="Name";
    private static final String AGE ="UserAge";
    private static final String CLASS ="Class";
    private static final String LEVEL ="Level";
    private static final String SKILL ="Skill";
    private static final String ACTIVITY ="Activity";
    private static final String TIME_STAMP ="TimeStamp";
    private static final String TAG_IN_GROUP ="InGroup";

    public ArrayList<HashMap<String, String>> myList;
    Activity activity;
    TextView name;
    TextView classType;
    TextView skill;
    TextView activityType;

    public UsersmyListAdapter(Activity activity, ArrayList<HashMap<String, String>> myList){
        super();
        this.activity = activity;
        this.myList = myList;
    }

    @Override
    public int getCount(){
        return myList.size();
    }

    @Override
    public Object getItem(int position){
        return myList.get(position);
    }

    @Override
    public long getItemId(int position){
        return 0;
    }

    public View getView(int position ,View convertView, ViewGroup parent){

        LayoutInflater inflater = activity.getLayoutInflater();

        if(convertView == null){
            convertView = inflater.inflate(R.layout.users_lfg_list_item,null);

            name = (TextView) convertView.findViewById(R.id.name);
            classType = (TextView) convertView.findViewById(R.id.classType);
            skill = (TextView) convertView.findViewById(R.id.skill);
            activityType = (TextView) convertView.findViewById(R.id.activityType);
        }

        HashMap<String, String> map = myList.get(position);
        name.setText(map.get(TAG_NAME));
        classType.setText(map.get(CLASS));
        skill.setText(map.get(SKILL));
        activityType.setText(map.get(ACTIVITY));

        return convertView;
    }

}

从我的活动到自定义适配器的调用在解析由我的AsyncTask提取的JSON字符串的方法的末尾被调用

1
2
UsersLFGListAdapter adapter = new UsersLFGListAdapter(this, UsersLFG);
listView.setAdapter(adapter);

也找到了解决方案

Varzaru的回答非常有效。经过更多谷歌搜索后,我还找到了另一个解决方案。只是想将其发布给其他看到此信息的人。如下

1
2
impleAdapter UserArrayList = new SimpleAdapter(UsersLFGListActivity.this, UsersLFG, R.layout.users_lfg_list_item, new String[] {TAG_DESTINY_USER_NAME, TAG_ACTIVE_CLASS, TAG_ACTIVE_CLASS_LIGHT, TAG_ACTIVITY_TYPE}, new int[]{R.id.name, R.id.Class, R.id.Light, R.id.activityType});
listView.setAdapter(UserArrayList);

好吧,在没有看到您的其他班级的情况下,我可以尝试一下。 首先,您的Listview适配器不好,请尝试以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class UsersmyListAdapter extends ArrayAdapter<HashMap<String, String>> {

    private static final String TAG_NAME ="Name";
    private static final String AGE ="UserAge";
    private static final String CLASS ="Class";
    private static final String LEVEL ="Level";
    private static final String SKILL ="Skill";
    private static final String ACTIVITY ="Activity";
    private static final String TIME_STAMP ="TimeStamp";
    private static final String TAG_IN_GROUP ="InGroup";

    public ArrayList<HashMap<String, String>> myList;
    Activity activity;

    public UsersmyListAdapter(Activity activity, ArrayList<HashMap<String, String>> myList){
        super(activity, R.layout.users_lfg_list_item, myList);
        this.activity = activity;
        this.myList = myList;
    }

    @Override
    public int getCount(){
        return myList.size();
    }

    @Override
    public Object getItem(int position){
        return myList.get(position);
    }

    @Override
    public long getItemId(int position){
        return 0;
    }

    public View getView(int position ,View convertView, ViewGroup parent){

        HashMap<String, String> map = myList.get(position);
        ItemViewHolder viewHolder;

        if(convertView == null){
            viewHolder = new ItemViewHolder();
            convertView = activity..getLayoutInflater().inflate(R.layout.users_lfg_list_item, null, true);
            viewHolder.name = (TextView) convertView.findViewById(R.id.name);
            viewHolder.classType = (TextView) convertView.findViewById(R.id.classType);
            viewHolder.skill = (TextView) convertView.findViewById(R.id.skill);
            viewHolder.activityType = (TextView) convertView.findViewById(R.id.activityType);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ItemViewHolder) convertView.getTag();
        }

        viewHolder.name.setText(map.get(TAG_NAME));
        viewHolder.classType.setText(map.get(CLASS));
        viewHolder.skill.setText(map.get(SKILL));
        viewHolder.activityType.setText(map.get(ACTIVITY));

        return convertView;
    }

    public class ItemViewHolder {
        TextView name;
        TextView classType;
        TextView skill;
        TextView activityType;
    }

}

其次,永远不要在完整的AsyncTask方法上设置Listview适配器。 声明列表视图之后,当AsyncTask完成后,应在create上设置适配器,然后将新项添加到列表中并调用:

1
adapter.notifyDataSetChanged();

希望对您的问题有所帮助!