0

我编写了以下代码来ContextMenu在 android 中编写简单的示例。在此示例中,我尝试了edit选项delete。但问题是我找不到要编辑的正确行。例如:如果我长按第 5 行的edit菜单,Layout则在第 n 行中可见。我不知道有什么问题。我也不知道如何实现这一点。我试过这种方式。

public class ContextMenuActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contextmenu);
        initComponents();
        setActionListener();
    }

     @Override
     public void onCreateContextMenu(ContextMenu menu, View v,
     ContextMenuInfo menuInfo) {

     super.onCreateContextMenu(menu, v, menuInfo);
     menu.setHeaderTitle("Options");
     menu.add(0, v.getId(), 0, "Edit");
     menu.add(0, v.getId(), 0, "Delete");
     }

    LinearLayout mLinearLayout;

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                .getMenuInfo();

        // info.position will give the index of selected item
        int IndexSelected = info.position;
        if (item.getTitle() == "Edit") {
            View v1 = list.getAdapter().getView(IndexSelected, list, null);
            mLinearLayout = (LinearLayout) v1.findViewById(R.id.myLinearLayout);
            mLinearLayout.setVisibility(View.VISIBLE);
            tv = (TextView) v1.findViewById(R.id.listitem_txt_item);
            Button b = (Button) v1.findViewById(R.id.myButton3);
            final EditText et = (EditText) v1.findViewById(R.id.myEditText3);
            b.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    tv.setText(et.getText().toString());
                    mLinearLayout.setVisibility(View.GONE);
                }
            });
            Toast.makeText(getApplicationContext(), "Hi edit " + IndexSelected,
                    Toast.LENGTH_LONG).show();
            // Code to execute when clicked on This Item
        } else if (item.getTitle() == "Delete") {
            Toast.makeText(getApplicationContext(), "Hi delete ",
                    Toast.LENGTH_LONG).show();
            // alistItems.remove(adapter.getItem(IndexSelected));

        } else {
            return false;
        }
        return true;
    }

    private void initComponents() {
        inflater = ContextMenuActivity.this.getLayoutInflater();

        list = (ListView) findViewById(R.id.contextmenu_lst_list);
        tv = (TextView) findViewById(R.id.listitem_txt_item);
        mLinearLayout = (LinearLayout) findViewById(R.id.myLinearLayout);
        alistItems = new ArrayList<String>();
        for (loopCount = 1; loopCount < 30; loopCount++) {
            alistItems.add("Item " + loopCount);
        }
        prepareView();
    }

    CustomAdapter adapter;
    LayoutInflater inflater;
    ListView list;
    TextView tv;
    ArrayList<String> alistItems;
    int loopCount;

    private void prepareView() {
        adapter = new CustomAdapter(getApplicationContext(), R.layout.listitem,
                alistItems);
        list.setAdapter(adapter);
        registerForContextMenu(list);
    }

    private void setActionListener() {
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {

            }
        });
    }

    public class CustomAdapter extends ArrayAdapter<String> {
        ArrayList<String> alistItems;
        int resource;

        public CustomAdapter(Context context, int resource,
                ArrayList<String> alistItems) {
            super(context, resource);
            this.alistItems = alistItems;
            this.resource = resource;

        }

        @Override
        public int getCount() {

            return alistItems.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder = new Holder();
            if (convertView == null) {

                convertView = inflater
                        .inflate(R.layout.listitem, parent, false);
            }
            holder.tvRow = (TextView) convertView
                    .findViewById(R.id.listitem_txt_item);
            convertView.setTag(holder);
            holder = (Holder) convertView.getTag();
            holder.tvRow.setText(alistItems.get(position));
            return convertView;
        }
    }

    class Holder {
        TextView tvRow;
    }
}
4

1 回答 1

0

改成这样:

 // global variable
Object item;

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    Adapter adapter = getListAdapter();
    item = adapter.getItem(info.position);

 menu.setHeaderTitle("Options");
 menu.add(0, v.getId(), 0, "Edit");
 menu.add(0, v.getId(), 0, "Delete");

}


@Override
public boolean onContextItemSelected(MenuItem item) {

    if (item.getTitle() == "Edit") {
        edit(item.getItemId());
    } else {
        return false;
    }
    return true;

}

public void edit(int id) {

Object IndexSelected = item;

// your code for edit


}

这个对我有用。

于 2013-09-17T06:58:23.940 回答