2014-10-11 4 views
-1

в этом коде после ввода новых элементов для адаптации моего списка не смог обновить и обновить с помощью notifyDataSetChanged(), например, для этой строки, которую может установить адаптер, без проблем.Адаптер Android с базовым адаптером

adapter = new ReceivedAdapter(context, items); 
getRequestFromServer(0, 10); 

после этого у меня есть 10 элементов в списке и адаптер.

private String getRequestFromServer(long lastID, int count) { 
    String received = ""; 
    try { 
     received = new JsonService(config_username, config_password, lastID, count, G.F_RECEIVE_SMS).request(); 
     JSONArray data_array = new JSONArray(received); 

     String mUserID = config_username; 
     for (int i = 0; i < data_array.length(); i++) { 
      JSONObject json_obj = data_array.getJSONObject(i); 

      String mLastID = json_obj.getString("id_recived_sms"); 
      String mSmsBody = json_obj.getString("sms_body"); 
      String mSmsNumber = json_obj.getString("sms_number"); 
      String mSenderName = json_obj.getString("mobile_number"); 
      String mContactName = json_obj.getString("contact_name"); 
      String mDate = json_obj.getString("recived_date"); 

      ReceivedItemStructure item = new ReceivedItemStructure(
        mLastID, 
        mUserID, 
        mSmsBody, 
        mSmsNumber, 
        mSenderName, 
        mContactName, 
        mDate 
      ); 
      items.add(item); 
     } 
     setListAdapter(adapter); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return received; 
} 

items.add(item); подсчет является то, что 10. Теперь в этой bewlo функция после того, как получить новый пункт я от сервера моего списка счетчик может изменить и обновить 11

private void addDataToList(String LastID, String SmsBody, String SmsNumber, String SenderName, String ContactName, String Date) { 
    String mLastID  = LastID; 
    String mUserID  = config_username; 
    String mSmsBody  = SmsBody; 
    String mSmsNumber = SmsNumber; 
    String mSenderName = SenderName; 
    String mContactName = ContactName; 
    String mDate = Date; 
    ReceivedItemStructure item = new ReceivedItemStructure(
      mLastID, 
      mUserID, 
      mSmsBody, 
      mSmsNumber, 
      mSenderName, 
      mContactName, 
      mDate 
    ); 
    items.add(item); 
    adapter.setRow(items); 
    adapter.notifyDataSetChanged(); 
} 

items.add(item); кола является то, что 11 адаптером обновления .i am как с adapter.setRow() и в ReceivedAdapter моем List размере 11. мой список после использования addDataToList() функция 11, но adapter.notifyDataSetChanged(); не работает, и я не вижу новый элемент в списке адаптеров и списков. все способы добавления и обновления List с новым элементом с пропуском items в порядке и ReceivedAdapter, и у меня нет проблемы.

мой адаптер:

public class ReceivedAdapter extends BaseAdapter 
{ 
    private LayoutInflater inflater; 
    private List<ReceivedItemStructure> row; 
    public ReceivedAdapter(Context context, List<ReceivedItemStructure> row) 
    { 
     this.row = row; 
     inflater = LayoutInflater.from(context); 
    } 
    public void setRow(List<ReceivedItemStructure> row) { 
     this.row = row; 
    } 
    @Override 
    public int getCount() { 
     return row.size(); 
    } 
    @Override 
    public ReceivedItemStructure getItem(int position) { 
     return row.get(position); 
    } 
    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     if(convertView ==null){ 
      convertView = inflater.inflate(R.layout.received_sms_list_fragment, null); 
     } 
     TextView tv_smsBody = (TextView)convertView.findViewById(R.id.tv_smsBody); 
     tv_smsBody.setText(getItem(position).getmSmsBody()); 

     TextView tv_smsSender = (TextView)convertView.findViewById(R.id.tv_smsSender); 
     tv_smsSender.setText(getItem(position).getmSmsBody()); 

     TextView tv_smsDate = (TextView)convertView.findViewById(R.id.tv_smsDate); 
     tv_smsDate.setText(getItem(position).getmDate()); 
     return convertView; 
    } 
} 
+0

[Пожалуйста, не повторяйте вопросы.] (Http://stackoverflow.com/questions/26312082/android-arrayadapter-notifydatasetchanged-dont-work) Просто обновить свой вопрос с какой-либо новой информации у вас есть добавить. –

ответ

1

Вместо того чтобы создавать новый items каждый раз и установить его к адаптеру .. попробуйте добавить и удалить из адаптера напрямую.

Сначала инициализируйте адаптер с необходимыми начальными значениями или пустым list.

  1. Далее, если вы хотите добавить .. звоните adapter.add(obj)
  2. Если вы хотите удалить вызовы adapter.remove(obj)
  3. Если вы хотите очистить адаптер вызов adapter.clear()

Наконец вызвать adapter.notifyDatasetChanged() всякий раз, когда вам необходимо, чтобы изменения отражались.

+0

адаптер не имеет '.add()' и не работает. вы можете вставить правильный код? я не могу решить проблему –

+0

Ну .. посмотрите на этот код .. https://github.com/thecodepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView У вас много шаблонов и ненужный код .. вам не нужно уменьшать свой собственный список внутри адаптера и переопределять метод getcount .. все его встроенные функции адаптера .. прочитайте это хорошо – Panther

+0

i gues вам следует переключиться на arrayadapter из jst-адаптера .. – Panther

0

Попробуйте этот путь, надеюсь, это поможет вам o решить вашу проблему.

public class ReceivedAdapter extends BaseAdapter 
{ 
    private Context context; 
    private List<ReceivedItemStructure> row; 
    public ReceivedAdapter(Context context, List<ReceivedItemStructure> row) 
    { 
     this.context = context; 
     this.row = row; 
    } 
    public void addItem(ReceivedItemStructure item) { 
     if(row!=null){ 
      row.add(item); 
      notifyDataSetChanged(); 
     } 
    } 
    public void removeItem(ReceivedItemStructure item) { 
     if(row!=null){ 
      row.remove(item); 
      notifyDataSetChanged(); 
     } 
    } 
    public void removeItemAtPosition(int position) { 
     if(row!=null){ 
      row.remove(position); 
      notifyDataSetChanged(); 
     } 
    } 
    public void clearAll() { 
     if(row!=null){ 
      row.clear(); 
      notifyDataSetChanged(); 
     } 
    } 
    @Override 
    public int getCount() { 
     return row.size(); 
    } 
    @Override 
    public ReceivedItemStructure getItem(int position) { 
     return row.get(position); 
    } 
    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder; 
     if(convertView ==null){ 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(context).inflate(R.layout.received_sms_list_fragment, null); 
      holder.tv_smsBody = (TextView)convertView.findViewById(R.id.tv_smsBody); 
      holder.tv_smsSender = (TextView)convertView.findViewById(R.id.tv_smsSender); 
      holder.tv_smsDate = (TextView)convertView.findViewById(R.id.tv_smsDate); 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.tv_smsBody.setText(getItem(position).getmSmsBody()); 
     holder.tv_smsSender.setText(getItem(position).getmSmsBody()); 
     holder.tv_smsDate.setText(getItem(position).getmDate()); 
     return convertView; 
    } 

    class ViewHolder{ 
     TextView tv_smsBody; 
     TextView tv_smsSender; 
     TextView tv_smsDate; 
    } 
} 
+0

Adapter dont refresh , :(см. http://pastebin.com/v10qiy0D и http://pastebin.com/tBHGH5y6 ссылки –

+0

Вместо того, чтобы добавлять новый элемент в элементы, просто добавьте элемент на adapter.addItem (item), и вам не требуется называть адаптер. notifyDataSetChanged(); –

+0

после удаления из этого файла: http: // pastebin.com/v10qiy0D Я не вижу никаких изменений на адаптере, и они не обновляют –