2015-11-13 80 views
1

我正在從一個遠程服務器上的數據庫獲取查詢的項目。它的SQL方面從兩個單獨的表中獲取信息,將它們結合起來並向我發送一個JSON編碼的字符串。然後,我解析字符串並創建一個ArrayList,其中包含String,String的HashMap以保存數據。所有這些工作都很好。有108個條目,所有相關變量都顯示了這一點。如何使用從ArrayList <HashMap <String,String >>插入數據到Android Studio中的列表視圖

當我嘗試將最終的ArrayList HashMap放入一個listView中時,出現了我的問題。我已經創建了一個自定義佈局,我知道它的作用就像通過使用數據提供者類和自定義適配器從一組數組中填充它一樣。

我按照教程爲ArrayList HashMap創建了一個自定義適配器(http://techlovejump.com/android-multicolum-listview/)。它似乎工作,除了它只會從ArrayList HashMap中拉出10-12個Items,然後重複。它確實在列表中有108個項目。我注意到,當我滾動列表時,剛剛離開屏幕的列表中的第一項變爲不同的項目。

我已經調試了自定義適配器類中的代碼,並且所有工作都正常,位置從0開始並上升。我大部分都看到它會變爲10,一次或兩次12.此時,通過getView方法,位置返回到0並重新開始。

我只是學習這一切,可能做錯了什麼,只是不知道是什麼。這裏是我必須調用自定義適配器類和類本身的代碼。

定義適配器這從分析我的JSON字符串,並建立原始的ArrayList HashMap的

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字符串的方法

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

找到了解決方案以及

瓦爾扎魯的答案奇妙地工作。在Google搜索之後,我還發現了另一個解決方案。只是想發佈給任何看到這個的人。這是因爲沒有看到你的其他類,我可以在此採取了一槍嘛如下

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); 

回答

0

。首先你的列表視圖適配器不好,試試這個:

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; 
    } 

} 

第二你不應該設置ListView的適配器上的AsyncTask您完整方法。你應該設置適配器上創建聲明列表視圖當的AsyncTask完然後添加新項目到列表中,並調用後:

adapter.notifyDataSetChanged(); 

希望它可以幫助您解決問題!

+0

我會嘗試您建議的編輯。只是爲了確保我在這裏正確理解你。在我的postExecute中,我調用瞭解析從服務器拉出的字符串的方法,創建JSON對象,然後將JSON添加到ArrayList HashMap。最後,我調用了自定義適配器類,並設置了適配器。我這樣做的原因是我的ArrayList HashMap在OnCreate方法中沒有被填充。你是說這不是一件好事?我得到什麼adapter.notifyDataSetChanged做我應該把它放在哪裏? –

+0

如果您仍有問題,請編輯您的帖子並加入活動課程。 – V01D1

+0

AsyncTask完成下載數據並解析之後,將其包含到原始列表中並調用adapter.notifyDataSetChanged。通過這種方式,適配器知道該列表中有新項目,並刷新列表視圖內容並顯示數據。您應該在創建時放入適配器。 – V01D1

相關問題