如何在ListView中修复setOnItemClickListener

时间:2015-02-03 14:31:57

标签: android listview click focus

我有一个ListView,其中包含更多行。在行内部,我有两个LinearLayouts(deleteItem和editItem),它们上面有setOnClickListener。当我试图点击deleteItem或editItem时它只能在第二次触摸时工作,我不知道为什么......我已经在stackoverflow上读了一些答案,但我找不到一个回答解决我的问题..

这是代码:

 import org.json.JSONArray;

 import android.app.AlertDialog;
 import android.app.ProgressDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v4.app.FragmentActivity;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.Toast;

 import com.currencymeeting.adapters.GetAllMyCurrencyListViewAdapter;
 import com.currencymeeting.beans.User;
 import com.currencymeeting.connectors.DeleteCurrencyConnector;
 import com.currencymeeting.connectors.MyCurrencyConnector;
 import com.currencymeeting.controllers.MessageDialogController;
 import com.currencymeeting.controllers.VariableController;

public class MyCurrencyActivity extends FragmentActivity {

private ListView getAllMyCurrencyListView;
private ProgressDialog dialog;
private View view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_currency);

    this.dialog = ProgressDialog.show(MyCurrencyActivity.this, MessageDialogController.PROGRESS_DIALOG_TITLE, MessageDialogController.PROGRESS_DIALOG_MESSAGE);
    this.getAllMyCurrencyListView = (ListView) findViewById(R.id.getAllMyCurrencyListView);
    new GetMyCurrencyResults().execute(new MyCurrencyConnector());

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

                    MyCurrencyActivity.this.view = view;

                    final TextView itemID = (TextView) view.findViewById(R.id.itemID);
                    final LinearLayout deleteItem = (LinearLayout) view.findViewById(R.id.deleteItem);
                    final LinearLayout editItem = (LinearLayout) view.findViewById(R.id.editItem);

                    deleteItem.setOnClickListener(
                            new OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    new AlertDialog.Builder(MyCurrencyActivity.this)
                                    .setMessage("Are you sure do you want to delete it?")
                                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) { 

                                            String vid = itemID.getText().toString();
                                            String userId = ""+VariableController.getInstance().getUser().getId();

                                            new DeleteCurrencyTask().execute(userId, vid);
                                        }
                                     })
                                     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) { 
                                            //do nothing
                                        }
                                     })
                                    .setIcon(android.R.drawable.ic_dialog_alert)
                                    .show();
                                }

                            }
                            );

                    editItem.setOnClickListener(
                            new OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    Intent intent = new Intent(getApplicationContext(),EditCurrencyActivity.class);
                                    startActivity(intent);
                                }

                            }
                            );

                }

            }
            );

    final LinearLayout menu = (LinearLayout) findViewById(R.id.menu);

    menu.setOnClickListener(
            new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getApplicationContext(), MenuLoggedActivity.class);
                    startActivity(intent);
                }
            }
            );      
}

public void setListAdapter(JSONArray jsonArray){
    this.getAllMyCurrencyListView.setAdapter(new GetAllMyCurrencyListViewAdapter(jsonArray,this));
    this.dialog.dismiss();
};

private class GetMyCurrencyResults extends AsyncTask<MyCurrencyConnector,Void,JSONArray>{
    @Override
    protected JSONArray doInBackground(MyCurrencyConnector... params) {
        User user = VariableController.getInstance().getUser();
        return params[0].getAllResults(user);
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {
        setListAdapter(jsonArray);
    }

}

private class DeleteCurrencyTask extends AsyncTask<String,Void,String[]>{

    @Override
    protected String[] doInBackground(String... params) {
        return params;
    }

    @Override
    protected void onPostExecute(String[] result) {

        boolean status = new DeleteCurrencyConnector().deleteTransaction(result[0],result[1]);
        LinearLayout itemViewId = (LinearLayout) MyCurrencyActivity.this.view.findViewById(R.id.itemViewID);
        if(status){
            new GetMyCurrencyResults().execute(new MyCurrencyConnector());
        } else {
            Toast.makeText(MyCurrencyActivity.this, "Error", Toast.LENGTH_LONG).show();
        }
    }

}

}

2 个答案:

答案 0 :(得分:0)

您的问题可能是由程序执行的方式引起的。首先对适配器初始化进行线程化,然后在适配器初始化完成之前,主线程开始附加onclick侦听器。这意味着您的列表视图将具有单击侦听器,但不包含适配器中的项目,以及单击列表视图一次

new GetMyCurrencyResults().execute(new MyCurrencyConnector());

这会在您的DeleteCurrencyTask中触发并再次设置适配器。要解决这个问题,请尝试将setOnClick initializaion放在

的后执行中
private class GetMyCurrencyResults extends AsyncTask<MyCurrencyConnector,Void,JSONArray>{

答案 1 :(得分:0)

我相信我意识到为什么只在第二次点击时调用deleteItem和editItem的事件,因为只有在加载代码时才调用getAllMyCurrencyListView.setOnItemClickListener(当我点击行时)时才会调用deleteItem和editItem clickListeners。所以我想我必须找到另一种方法来制作这些活动