您的位置:首页 > 其它

ListView onItemLongClick 弹出ContextMenu

2017-02-08 15:13 489 查看
开发了一个简单的功能:

长按ListView中的item后, 弹出选择菜单:

public class NetworktoolActivity extends Activity implements View.OnClickListener, AdapterView.OnItemLongClickListener{

boolean isSendItem = false;
int selectPos = -1;
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
isSendItem = tranAdapter.isSendItem(position);
selectPos = position;
registerForContextMenu(view);
openContextMenu(view);
unregisterForContextMenu(view);
return false;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.add("COPY");
if(isSendItem)menu.add("RETRY");
else menu.add("SAVE AS FILE");
super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getTitle().equals("COPY")){
ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText(TAG, tranAdapter.getContent(selectPos)));
}else if(item.getTitle().equals("RETRY")){
etUrl.setText(tranAdapter.getContent(selectPos));
onClick(btGo);
}else if(item.getTitle().equals("SAVE AS FILE")){
saveAsFile(tranAdapter.getItem(selectPos));
}
return true;
}


出了异常:

02-08 14:26:04.733 11061-11061 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.StackOverflowError
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2856)
at android.view.View.showContextMenu(View.java:4277)
at android.app.Activity.openContextMenu(Activity.java:2879)
at com.ansondroider.networktool.NetworktoolActivity.onItemLongClick(NetworktoolActivity.java:89)
at android.


修正代码如下:

public class NetworktoolActivity extends Activity implements View.OnClickListener, AdapterView.OnItemLongClickListener{

String TAG = "NetworktoolActivity";
EditText etUrl;
Button btGo;
ListView lvInfos;
TransactionAdapter tranAdapter;
H h;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_networktool);
init();
}

void init(){
etUrl = (EditText)findViewById(R.id.etUrl);
btGo = (Button)findViewById(R.id.btGo);
btGo.setOnClickListener(this);
lvInfos = (ListView)findViewById(R.id.lvInfo);
lvInfos.setOnItemLongClickListener(this);
tranAdapter = new TransactionAdapter(this);
lvInfos.setAdapter(tranAdapter);
//关键CODE
registerForContextMenu(lvInfos);
}

@Override
public void onClick(View v) {
if(v == btGo){
startNewRequest(etUrl.getText().toString());
}
}

void startNewRequest(final String url){
new Thread(){
@Override
public void run() {
Transaction t = new Transaction();
t.id = t.hashCode();
t.url = url;
t.reqTime = TimeUtils.getTimeString();
t.res = "waiting...";
Message msg = h.obtainMessage(H.MSG_ADD, t);
h.sendMessage(msg);
byte[] content = HttpUtilsAndroid.getByteContentFromURL(url);
t.resTime = TimeUtils.getTimeString();
t.rawData = content;
t.res = content != null ? new String(content) : "ERROR";
h.sendEmptyMessage(H.MSG_UPDATE);
}
}.start();
}

boolean isSendItem = false;
int selectPos = -1;
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
isSendItem = tranAdapter.isSendItem(position);
selectPos = position;
//----------递归来源----------
//registerForContextMenu(view);
//openContextMenu(view);
//unregisterForContextMenu(view);
return false;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.add("COPY");
if(isSendItem)menu.add("RETRY");
else menu.add("SAVE AS FILE");
super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getTitle().equals("COPY")){
ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText(TAG, tranAdapter.getContent(selectPos)));
}else if(item.getTitle().equals("RETRY")){
etUrl.setText(tranAdapter.getContent(selectPos));
onClick(btGo);
}else if(item.getTitle().equals("SAVE AS FILE")){
saveAsFile(tranAdapter.getItem(selectPos));
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐