Android - ListView行中删除按钮的确认对话框

时间:2014-07-08 10:38:38

标签: java android

我正在寻找一种实现对话框的方法,该对话框在单击ListView行的删除按钮时要求确认。我尝试在我的自定义ArrayAdapter中执行此操作,但因为它不是活动,所以我不知道该怎么做。

当我将整个onClick-Listener放在MainActivity中时,我没有如何找出按钮被点击的位置,以便我可以在之后删除它。

public class ServiceAdapter extends ArrayAdapter<Service> {

    private final Singleton singleton = Singleton.getInstance();
    private ArrayList<Service> services;

    public ServiceAdapter(Context context, ArrayList<Service> services) {
        super(context, 0, services);

        this.services = services;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        Service service = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.listview_row, parent, false);
        }
        // Lookup view for data population
        TextView quantity = (TextView) convertView
                .findViewById(R.id.QUANTITY_CELL);
        TextView description = (TextView) convertView
                .findViewById(R.id.DESCRIPTION_CELL);
        Button delete = (Button) convertView.findViewById(R.id.BUTTON_DELETE);

        // Populate the data into the template view using the data object
        quantity.setText(String.valueOf(service.getQuantity()));
        description.setText(service.getDescription());

        // Set up the listener for the delete button.
        final View view = convertView;
        view.setTag(Integer.valueOf(position));
        delete.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                Integer index = (Integer) view.getTag();
                services.remove(index.intValue());
                notifyDataSetChanged();
            }
        });

        // Return the completed view to render on screen
        return convertView;
    }

}

public class MainActivity extends Activity {

    private ListView serviceList;
    private ArrayList<Service> services;
    private ServiceAdapter adapter;
    private final Singleton singleton = Singleton.getInstance();

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serviceList = (ListView) findViewById(R.id.service_list);
        adapter = new ServiceAdapter(this, services);
        serviceList.setAdapter(adapter);

        serviceList.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    final int position, long id) {

                Service temp = services.get(position);
                singleton.setQuantity(temp.getQuantity());
                singleton.setDescription(temp.getDescription());
                setPosition(position);

                openDetailedEntry();

            }
        });
    }

    public void openDetailedEntry() {
        Intent i = new Intent(this, DetailedEntryActivity.class);

        // Check if the meant Activity is actually resolvable
        if (i.resolveActivity(getPackageManager()) != null)
            startActivity(i);
    }
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp" >

    <TableLayout 
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.1"
            android:paddingTop="8dp"
            >   

            <ListView 
                android:id="@+id/service_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:dividerHeight="2dp" />

        </TableLayout>

</LinearLayout>

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/listview_row"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:paddingTop="4dip"
     android:paddingBottom="4dip"
     android:paddingLeft="4dip"
     android:paddingRight="4dip"
     android:orientation="horizontal">


     <TextView android:id="@+id/QUANTITY_CELL"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="2"
         android:textSize="20sp"
         />

     <TextView android:id="@+id/DESCRIPTION_CELL"
         android:layout_width="0dip"
         android:layout_height="wrap_content" 
         android:textSize="20sp"
         android:layout_weight="6" />

     <Button
         android:id="@+id/BUTTON_DELETE"
         android:layout_width="0dp"
         android:layout_height="35dp"
         android:layout_weight="1"
         android:textSize="12sp"
         android:focusable="false"
         android:text="@string/delete" />

</LinearLayout>

如果你需要什么,请告诉我。

1 个答案:

答案 0 :(得分:2)

ServiceAdapter中构建AlertDialog像这样,

private AlertDialog mDialog; 
private int mListRowPosition;
public ServiceAdapter(Context context, ArrayList<Service> services) {
    super(context, 0, services);
    this.services = services;

    //Create AlertDialog here
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setMessage("Your Message")
           .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // Use mListRowPosition for clicked list row...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
               }
           });
    // Create the AlertDialog object 

    mDialog = builder.create();
}

ServiceAdapter赞,

中创建方法
private void showDialog(int position)
{
 mListRowPosition = position;
 if(mDialog != null)
 mDialog.show();
}

现在在onClick()只需致电

showDialog(position); // But make position of getView() as final...