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(); |
希望对您的问题有所帮助!