2014-10-11 3 views
-1

이 코드는 adapert에 새로운 항목을 추가 한 후 내 목록을 새로 고치지 않고 notifyDataSetChanged()으로 업데이트 할 수 없습니다. 예를 들어이 줄에 대해서는 아무런 문제없이 설정할 수 있습니다.Android Refresh Adapter with BaseAdapter

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); 수에 내 목록의 수를 변경할 수있는 서버 업데이트에서 새로운 I 아이템을 얻을 adapter.setRow()와 그 11 사자 아 업데이트 어댑터입니다 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.notifyDatasetChanged() 전화 어댑터 호출 마지막으로 adapter.clear()

을 비우고 싶을 때 전화를 adapter.remove(obj)

  • 을 제거 할 때마다 당신을 변경 사항을 반영해야합니다.

  • +0

    어댑터에는'.add()'가 없으므로 작동하지 않습니다. 올바른 코드를 붙여 넣을 수 있습니까? 나는 문제를 해결할 수 없다. –

    +0

    음 ..이 코드를 살펴 보자 .. https://github.com/thecodepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView 당신은 많은 상용구가 있고 불필요한 코드 .. 당신은 어댑터 내부에서 자신의 목록을 decleare하고 getcount 메서드를 재정의해야합니다 .. 어댑터의 모든 inbuilt 기능 .. 잘 읽으십시오 – Panther

    +0

    나는 jst 어댑터에서 arrayadapter로 전환해야한다고 생각합니다. – 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

    어댑터 dont 새로 고침 . (http://pastebin.com/v10qiy0D 및 http://pastebin.com/tBHGH5y6 링크를 참조하십시오. –

    +0

    항목에 새 항목을 추가하는 대신 adapter.addItem (항목)에 항목을 추가하기 만하면 어댑터를 호출 할 필요가 없습니다. 이 파일에서 http : // pastebin을 제거한 후 notifyDataSetChanged(); –

    +0

    을 제거하십시오.co.kr/v10qiy0D 나는 어댑터에 대한 변경 사항을 보지 않고 새로 고침하지 않습니다. –