Как обновить просмотр списка после кнопки CRUD внутри ListAdapter с помощью асинхронной задачи - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть 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 выше, но просмотр списка по-прежнему не обновляется;данные успешно удалены из базы данных. Где я неправ? любая помощь будет очень признателен, спасибо

...