如何删除片段中的列表视图项?

时间:2018-12-03 10:25:27

标签: java android listview

我正在尝试从列表视图中删除一个项目,但是有一个问题..我正在使用一个片段,我不知道如何获取“删除图像按钮”来添加onClickListener ... 那是我的付款按钮xml,它在payment_list_view.xml中:

<ImageButton
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/trash_icon"
            android:padding="10dp"
            android:id="@+id/delete_payment_btn"
            android:background="@android:color/white" />

然后,我有我的PaymentFragment,其中包含我的列表视图:

 package com.nicola.baccillieri.splitpayment;




public class PaymentFragment extends Fragment {

private String descString;
private int price;
private String payedBy;
private ArrayList<String> descPayArray;
private ArrayList<Integer> priceArray;
private ArrayList<String> payedByArray;
int trash;
PaymentAdapter customAdapter;
private final static String SHARED_PREFS = "sharedPrefs";
FirebaseFirestore db;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    db = FirebaseFirestore.getInstance();
    trash = (R.drawable.trash_icon);
    descPayArray = new ArrayList<>();
    priceArray = new ArrayList<>();
    payedByArray = new ArrayList<>();


}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    final View rootView=inflater.inflate(R.layout.payments_fragment,container,false);

    ProgressBar detailsPb = rootView.findViewById(R.id.details_pb);
    detailsPb.getIndeterminateDrawable().setColorFilter(0XFF3F51B5,
            PorterDuff.Mode.MULTIPLY);
    detailsPb.setVisibility(View.VISIBLE);

    final ListView listView = rootView.findViewById(R.id.paymentLv);
    String email = getEmail();
    String groupName = getActivity().getIntent().getStringExtra("title");

    DocumentReference docRef = db.collection("users").document(email).collection("Group").document(groupName);

    docRef.collection("Payments")
            .get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for (QueryDocumentSnapshot document : queryDocumentSnapshots) {

                        //Extracting payment description from each document

                        descString = document.getId();
                        descPayArray.add(descString);

                        //Extracting cost and who payed from each document

                        price = document.getLong("cost").intValue();
                        priceArray.add(price);

                        payedBy = document.getString("payed by");
                        payedByArray.add(payedBy);
                        trash = R.drawable.trash_icon;
                        customAdapter = new PaymentAdapter(getActivity(), descPayArray, payedByArray, priceArray, trash);
                        listView.setAdapter(customAdapter);
                        ProgressBar detailsPb =  rootView.findViewById(R.id.details_pb);
                        detailsPb.setVisibility(View.GONE);
  // That's the line that cause the error
                        ImageButton deleteBtn = rootView.findViewById(R.id.delete_payment_btn);
                        deleteBtn.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                String groupName = getActivity().getIntent().getStringExtra("title");
                                int positionToRemove = (int) v.getTag();
                                String email = getEmail();
                                String paymentToRemove = descPayArray.get(positionToRemove);
                                DocumentReference docRef = db.collection("users").document(email).collection("Group").document(groupName).collection("Payments").document(paymentToRemove);
                                docRef.delete();

                                descPayArray.remove(positionToRemove);
                                customAdapter.notifyDataSetChanged();
                            }
                        });

                    }
                    // If there isn't any payment display a blank activity
                    ProgressBar detailsPb =  rootView.findViewById(R.id.details_pb);
                    detailsPb.setVisibility(View.GONE);


                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    ProgressBar detailsPb =  rootView.findViewById(R.id.details_pb);
                    detailsPb.setVisibility(View.GONE);
                    Toast.makeText(getContext(), "Failed to load payments", Toast.LENGTH_LONG).show();
                }
            });



    return rootView;

}


public String getEmail() {

    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    String email = (sharedPreferences.getString("email", ""));
    return email;
}}

最后,文件group_detail_activity.xml包含我的2个带有选项卡布局的片段。 现在,应用程序在必须显示PaymentFragment时崩溃,因为ImageButton deleteBtn = rootView.findViewById(R.id.delete_payment_btn);说

`java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference".

那是因为我的rootView包含payment_fragment.xml,而不是payment_list_view.xml。因此,它找不到该按钮。 我尝试添加final View rootListView=inflater.inflate(R.layout.payment_list_view,container,false); 然后显示列表视图,但是当我单击删除按钮时,它什么也没做。 我该怎么办?

That's the fragment with the listview:

那是我的PaymentAdapter:

package com.nicola.baccillieri.splitpayment;


public class PaymentAdapter extends BaseAdapter {

private Context context;
private ArrayList<String> payDesc;
private ArrayList<String> payedBy;
private ArrayList<Integer> price;
private int trash;
LayoutInflater inflater;


public PaymentAdapter(Context context, ArrayList<String> payDesc, ArrayList<String> payedBy, ArrayList<Integer> price, int trash) {
    this.context = context;
    this.payDesc = payDesc;
    this.payedBy = payedBy;
    this.price = price;
    this.trash = trash;
    inflater = (LayoutInflater.from(context));
}

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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = inflater.inflate(R.layout.payment_list_view, null);

    TextView paymentDesc = convertView.findViewById(R.id.payedDescTv);
    TextView payedByTv = convertView.findViewById(R.id.payedByTv);
    TextView priceTv = convertView.findViewById(R.id.priceTv);
    ImageButton trashIcon = convertView.findViewById(R.id.delete_payment_btn);

    paymentDesc.setText(payDesc.get(position));
    payedByTv.setText("Payed by " + payedBy.get(position));
    priceTv.setText(String.valueOf(price.get(position)) + "€");
    trashIcon.setImageResource(trash);
    trashIcon.setTag(position);

    return convertView;
}}

问题是我需要同时从列表视图和Firebase中删除该项目...所以我需要getEmail()方法和PaymentFragment中的getExtra ..如果我将侦听器放在适配器上,如何可以删除Firebase吗?

4 个答案:

答案 0 :(得分:0)

尝试这种方式。在单击的列表上,您可以删除项目

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            payedByArray.remove(position);
            adapter.notifyItemRemoved(position);

        }
    });

另一种方法是将Delete Button放在payment_list_view中,然后在适配器中单击该位置,然后单击并删除它

答案 1 :(得分:0)

从Custom_adapater的查看器中获取视图ID,您可以使用

轻松删除该项目
payedByArray.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, payedByArray.size());

How to delete list item,一个SO的问题已经回答了。 那可能会解决您的问题。

答案 2 :(得分:0)

您可以设置一个侦听器,以将“删除图像”按钮操作链接到您的片段。然后可以单击按钮,触发监听器并执行片段中想要的操作。您可以发送职位以删除好元素

答案 3 :(得分:0)

您的适配器不知道该列表正在被修改。删除项目后,您需要向适配器提供最新列表。

在适配器代码中公开您的payedByArray列表。

此活动代码。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        payedByArray.remove(position);
        //payedByArray is activity list;
        adapter.payedByArray = payedByArray;
        adapter.notifyItemRemoved(position);
    }
});