2016-03-08 240 views
-3

使用自定義適配器的android listview擴展ArrayAdapter不會填充列表項目,直到它滾動我也已經調用方法適配器notifyDataSetChanged方法上adpater,但仍然這不工作在這裏是我的代碼 這是MainActivity文件Listview不填充unitl滾動

public class MainActivity extends AppCompatActivity { 

ListView list; 

RequestQueue requestQueue; 
private CustomAdapter mCustomAdpater; 
Button insert, show; 
private List<RowItem> userList = new ArrayList<>(); 
//String insertUrl = "http://192.168.0.107:8000/athlete/insert.php"; 
String showUrl = "http://192.168.0.107:8000/athlete/show.php"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    show = (Button) findViewById(R.id.show); 
    insert = (Button) findViewById(R.id.register); 
    list = (ListView) findViewById(R.id.list); 
    mCustomAdpater = new CustomAdapter(this, R.layout.list_row, userList); 


    requestQueue = Volley.newRequestQueue(getApplicationContext()); 
    show.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mCustomAdpater.clear(); 
      JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, 
        showUrl, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        //JSONArray users = null; 
        try { 

         JSONArray users = response.getJSONArray("users"); 
         for (int i=0; i<users.length(); i++){ 
          JSONObject user = users.getJSONObject(i); 

          int id = user.getInt("id"); 
          String name = user.getString("name"); 
          String sports = user.getString("sports"); 
          String location = user.getString("location"); 
          String number = user.getString("number"); 

          RowItem newRowItem = new RowItem(id, name, sports, location, number); 
          userList.add(newRowItem); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

        mCustomAdpater.notifyDataSetChanged(); 
        list.setAdapter(mCustomAdpater); 
        Log.d("onResponse CALLED", "OK"); 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("Error ", showUrl); 
       } 
      }); 
      requestQueue.add(jsonObjectRequest); 
     } 
    }); 
} 

這裏是我的自定義適配器

public class CustomAdapter extends ArrayAdapter<RowItem> { 
Context context; 
public CustomAdapter(Context context, int resourceId, List<RowItem> items){ 
    super(context, resourceId, items); 
    this.context = context; 
} 

private class ViewHolder{ 
    TextView name; 
    TextView sports; 
    TextView location; 
    TextView number; 
} 

public View getView(int position, View convertView, ViewGroup parent){ 
    ViewHolder holder = null; 
    RowItem rowItem = getItem(position); 

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(MainActivity.LAYOUT_INFLATER_SERVICE); 
    if (convertView==null){ 
     convertView = mInflater.inflate(R.layout.list_row, null); 
     holder = new ViewHolder(); 
     holder.name = (TextView) convertView.findViewById(R.id.user_name); 
     holder.sports = (TextView) convertView.findViewById(R.id.user_sports); 
     holder.location = (TextView) convertView.findViewById(R.id.user_location); 
     holder.number = (TextView) convertView.findViewById(R.id.user_contact); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
     holder.name.setText(rowItem.getName()); 
     holder.sports.setText(rowItem.getSports()); 
     holder.location.setText(rowItem.getLocation()); 
     holder.number.setText(rowItem.getNumber()); 
    } 
    return convertView; 
} 

} 
+0

嘗試將持有人=(ViewHolder)convertView.getTag();在其他地方。保持所有setTextoutside其他。 – Sayyaf

+0

還保留mCustomAdpater.notifyDataSetChanged(); list.setAdapter(mCustomAdpater);在mCustomAdpater下面= new CustomAdapter(this,R.layout.list_row,userList); – Sayyaf

+0

謝謝@Sayyaf做的工作 –

回答

2

試着把holder=(ViewHolder) convertView.getTag();放在其他部分。將所有setText保存在其他地方之外。

0

這裏是你的問題

if (convertView==null){ 
    convertView = mInflater.inflate(R.layout.list_row, null); 
    holder = new ViewHolder(); 
    holder.name = (TextView) convertView.findViewById(R.id.user_name); 
    holder.sports = (TextView) convertView.findViewById(R.id.user_sports); 
    holder.location = (TextView) convertView.findViewById(R.id.user_location); 
    holder.number = (TextView) convertView.findViewById(R.id.user_contact); 
    convertView.setTag(holder); 
}else{ 
    holder = (ViewHolder) convertView.getTag(); 
} 
    holder.name.setText(rowItem.getName()); 
    holder.sports.setText(rowItem.getSports()); 
    holder.location.setText(rowItem.getLocation()); 
    holder.number.setText(rowItem.getNumber()); 
return convertView; 

}

+0

我得到的數據,但問題是列表視圖數據不會填充,直到我滾動列表視圖 –

+0

你改變了代碼,我建議 –