У меня есть Listview внутри фрагмента и CustomListAdapter, который расширяет ArrayAdapter для заполнения списка, и я использую Async Task, чтобы получить Array из моего веб-сервиса. Внутри Custom Adapter, я поставил кнопку, чтобы удалить элемент, когда он понадобится пользователю. Я ищу какой-то метод, но не могу найти способ обновить мой список при каждом нажатии кнопки
вот мой фрагмент
public class ContactPendingFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
ListView lv;
View view;
SwipeRefreshLayout swipeRefreshLayout;
ContactPendingAdapter contactPendingAdapter;
public ContactPendingFragment() {
// Required empty public constructor
}
@Override
public void onResume() {
super.onResume();
LoadList(view);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
}
@Override
public void onRefresh(){
swipeRefreshLayout.setRefreshing(true);
LoadList(view);
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
cVar = (ContactActivity) getActivity();
view = inflater.inflate(R.layout.fragment_contactpending, container, false);
lv = view.findViewById(R.id.lvwContactPending);
swipeRefreshLayout = view.findViewById(R.id.pullToRefreshContactPending);
swipeRefreshLayout.setOnRefreshListener(this);
LoadList(view);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
}
}
public void LoadList(final View view) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("m", "2");
AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data, getActivity());
asyncHttpPost.setListener(new AsyncHttpPost.Listener(){
@Override
public void onResult(String result) {
// do something, using return value from network
// On complete call either onSignupSuccess or onSignupFailed
// depending on success
switch (result.substring(0,1)) {
case "0":
String r = result.substring(2);
PopulateList(r);
break;
case "1":
case "2":
lv.setAdapter(null);
break;
}
}
});
asyncHttpPost.execute("helpme.php");
}
public static char ASCIIToChar(final int ascii){
return (char)ascii;
}
public void PopulateList(String result) {
lv.setAdapter(null);
ArrayList<ContactListData> arrayList = new ArrayList<ContactListData>();
arrayList.clear();
String newline = ""+ASCIIToChar(9)+"";
String newcol = ""+ASCIIToChar(8)+"";
if (result.contains(newline)) {
String[] sLines = result.split(newline);
for (String sLine : sLines) {
String[] s = sLine.split(newcol);
arrayList.add(new ContactListData(s[0],s[1]));
}
}
contactPendingAdapter = new ContactPendingAdapter(getActivity(), R.layout.fragment_contactpending, arrayList);
lv.setAdapter(contactPendingAdapter);
contactPendingAdapter.notifyDataSetChanged();
contactPendingAdapter.notifyDataSetInvalidated();
lv.invalidateViews();
}
и вот мой адаптер, который содержит кнопку отмены
public class ContactPendingAdapter extends ArrayAdapter {
ArrayList<ContactListData> arrayList;
Context context;
ContactListData contactListData;
public ContactPendingAdapter(Context context, int resource, ArrayList<ContactListData> arrayList) {
super(context, resource, arrayList);
this.arrayList=arrayList;
this.context=context;
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
contactListData = arrayList.get(position);
if(convertView == null) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.activity_contactpending, null);
TextView cID = convertView.findViewById(R.id.txtContactPendingID);
TextView cName = convertView.findViewById(R.id.txtContactPendingName);
Button bCancel = convertView.findViewById(R.id.btnContactCancel);
cID.setText(contactListData.ContactID);
cName.setText(contactListData.ContactName);
bCancel.setOnClickListener(new ClickHandler(contactListData.ContactID, position));
}
return convertView;
}
private class ClickHandler implements View.OnClickListener {
String mID;
String msg;
String ask;
int mPos;
private ClickHandler(String id, int pos) {
mID = id;
mPos = pos;
}
@Override
public void onClick(View view) {
msg = "";
ask = "This will ";
switch (view.getId()) {
case R.id.btnContactCancel:
msg = "1";
ask = ask + "cancel your request, continue?";
break;
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(true);
builder.setMessage(ask);
builder.setPositiveButton("Confirm",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ProcessData(msg,mID,mPos);
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
private void ProcessData(String proc, String id, final int pos) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("x", id); //--------------contact LISTS
AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data, context);
asyncHttpPost.setListener(new AsyncHttpPost.Listener(){
@Override
public void onResult(String result) {
switch (result.substring(0,1)) {
case "0":
String r = result.substring(2);
PopulateResult(r, pos);
break;
case "1":
case "2":
break;
}
}
});
asyncHttpPost.execute("helpme.php");
}
private void PopulateResult(String result, int pos) {
Toast t = Toast.makeText(context, result, Toast.LENGTH_SHORT);
t.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL,0,0);
t.show();
notifyDataSetChanged();
notifyDataSetInvalidated();
}
}
Я пытаюсь notifyDataSetChanged на PopulateResult выше, но просмотр списка по-прежнему не обновляется;данные успешно удалены из базы данных. Где я неправ? любая помощь будет очень признателен, спасибо