2016-04-25 72 views
0

我使用視圖分頁器與滑動標籤佈局。而且我使用自定義適配器顯示數據的列表視圖。同時也列表視圖onclick我有一個列表視圖細節活動,我更詳細地顯示數據。在這些細節活動中,我正在對數據進行一些更改(某些後期處理方法)。之後,我創建了一個customAdapter類的實例,並調用notifyDataSetChanged()以刷新列表視圖。我的問題在這裏是列表視圖有時刷新很快,有些時候會延遲幾秒鐘。 那麼,有人可以建議我正確使用列表視圖和需要做什麼更改,以便刷新列表視圖,每當一個post方法執行。 我的代碼片段類:請建議我正確使用notifyDataSetChanged()

private void showJsonData(String response) { 

    try { 
     String serviceID = LoggedInUserStore.getLoggedInServiceId(getContext()); 
     List<Complaint> userList = new ArrayList<>(); //ArrayList of type user(POJO CLASS) 
     JSONArray jsonArray = new JSONArray(response); 

     for (int i = 0; i < jsonArray.length(); i++) { 
      if (serviceID.equals(jsonArray.getJSONObject(i).getString("ServiceID"))) { 
       if (jsonArray.getJSONObject(i).getString("CallStatusID").equalsIgnoreCase("1")) { 
        userList.add(0, Complaint.fromJson(jsonArray.getJSONObject(i))); // 
       } 
      } 

     } 

     assignAdapter = new AssignAdapter(getActivity(), userList); 
     listView.setAdapter(assignAdapter); 
     listView.invalidateViews(); 
     assignAdapter.notifyDataSetChanged(); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

}

My custom adapter class 
public class AssignAdapter extends BaseAdapter implements Filterable { 
List<Complaint> ticket = new ArrayList<>(); 
private Context context; 
String ticketNo, complaint, raiseDate; 
Complaint user; 
List<Complaint> temporaryList = new ArrayList<>(); 

/*String status, priority;*/ 

public AssignAdapter(Context context, List<Complaint> ticket) { 
    this.context = context; 
    this.ticket = ticket; 
    this.temporaryList = ticket; 
} 

@Override 
public int getCount() { 
    return temporaryList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return temporaryList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public class viewHolderItem { 
    TextView ticketNumberText, complaintNameText, raisedDateText; 
} 

//Set the layout for the fragment and return it. 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    viewHolderItem holder; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.custom_list_view, null, true); 

     holder = new viewHolderItem(); 
     holder.ticketNumberText = (TextView) convertView.findViewById(R.id.ticketIdSupervisor); 
     holder.complaintNameText = (TextView) convertView.findViewById(R.id.complaintNameSupervisor); 
     convertView.setTag(holder); 
    } else { 
     holder = (viewHolderItem) convertView.getTag(); 
    } 

    user = temporaryList.get(position); 
    if (user != null) { 
     //Get the Ticket Number 
     Typeface custom_font = Typeface.createFromAsset(context.getAssets(), "fonts/DroidSerif.ttf"); 
     ticketNo = temporaryList.get(position).getTicketNumber(); 
     holder.ticketNumberText.setText(ticketNo); 
     holder.ticketNumberText.setTag("ticketNumber"); 
     holder.ticketNumberText.setTypeface(custom_font); 


     //Get the complaint Name 
     complaint = temporaryList.get(position).getComplaintDetails(); 
     holder.complaintNameText.setText(complaint); 
     holder.complaintNameText.setTag("complaint"); 
     holder.complaintNameText.setTypeface(custom_font); 

    } 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(context.getApplicationContext(), ComplaintDetailsSupervisor.class); 
      i.putExtra("COMPLAINT NAME", temporaryList.get(position).getComplaintDetails()); 
      i.putExtra("RAISED DATE", temporaryList.get(position).getRaisedDate().substring(0, 10)); 
      context.startActivity(i); 
     } 
    }); 
    notifyDataSetChanged(); 
    return convertView; 
} 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 

}

我的列表查看詳情活動課

dialogButtonOk.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         try { 
          assignComplaint(); 
          al.remove(position); 

          AssignAdapter assignAdapter = new AssignAdapter(getApplicationContext(), al); 
          assignAdapter.notifyDataSetChanged(); 

          ComplaintDetailsSupervisor.this.finish(); 


         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 

       dialogButtonNo.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.dismiss(); 
        } 
       }); 

       dialog.show(); 
      } 
     } 
    }); 


} 

public void assignComplaint() throws JSONException { 
    //my custom method... 
} 

在列表查看詳情活動課我做這

al.remove(position); 
AssignAdapter assignAdapter = new AssignAdapter(getApplicationContext(), al); 
assignAdapter.notifyDataSetChanged(); 
ComplaintDetailsSupervisor.this.finish(); 

刪除列表視圖的位置並立即調用適配器。這工作正常,但我不知道爲什麼有時它不刷新..可能是當列表視圖有一個單一的項目,它不會立即刷新。

+0

它在什麼情況下不立即刷新? – barq

+0

說當列表視圖中有一些5-6項目時,當我嘗試執行一些post方法時,該項目不會被刪除。當我執行post方法項目時,必須從列表視圖中刪除。但有時它不會熄滅..直到我刷新刷新。 – Rakesh

+0

當用戶執行post方法時,我正在完成lv詳細信息活動,並將他發送回數據以列表視圖形式顯示,並且信息很少的片段。該項目需要從該片段中刪除,這不會發生一些時間。 – Rakesh

回答

0

您正在創建一個新的適配器並對其調用notifyDatasetChanged,但尚未使用新適配器作爲參數調用setAdapter,因此您的列表不會被刷新。

你需要調用

setAdapter(assignAdapter) 

或重用現有的assignAdapter,然後調用notifyDatasetChanged()就可以了。

+0

我不能將適配器設置爲我的列表視圖。因爲它是在我的片段中定義的。 &我從我的活動中的數組列表中刪除項目並調用notifyDataSetChanged。 – Rakesh

+0

在按鈕的onClickListener中,您正在創建一個新的assignAdapter,並且從不將其設置爲列表中的適配器。所以這個適配器從來沒有使用。 – barq

+0

我做了很多搜索,但沒有找到解決方案。先生,你能告訴我如何爲Fragment類中定義的列表視圖設置適配器嗎? – Rakesh