小白求教 android中listview的点击冲突问题

刚才写了一段代码 想通过点击listview上每一项的imageview删除数据库中对应的这一条数据,
但运行时每次都必须点击两下imageview才能删除这一项,之前想过在listview的适配器中来做这个
操作,但是看过的代码好像都没有这么做过并且这样做的话没法更新数据,现在想问问
有没有什么好的方法可以解决这个问题 。对了,设置focusable和clickable属性也没法处理。设置成imagebutton的话 , 由于listview的每一项是通过反射来获取到的

给imagebutton设置onclick属性的话 ,数据就没法传递了,毕竟还是要删除数据库中的数据

```package com.personal.fyd.blacknumber;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**

  • Created by asus on 2016/10/19. */

public class MyAdapter extends BaseAdapter {
private List list;
private Context context;

public MyAdapter(List<NumberBean> list, Context context) {
    this.list = list;
    this.context = context;

// for (NumberBean bean:list
// ) {
// Log.i(context+"",bean.getNumber()+" "+bean.getMode());
// }
}

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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    NumberBean bean;
    if (convertView == null) {
        convertView = View.inflate(context, R.layout.item, null);
        viewHolder = new ViewHolder();
        viewHolder.number_tv = (TextView) convertView.findViewById(R.id.tv_number);
        viewHolder.mode_tv = (TextView) convertView.findViewById(R.id.tv_mode);
        viewHolder.delete_iv = (ImageView) convertView.findViewById(R.id.iv_delete);
        convertView.setTag(viewHolder);
    }else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    bean = list.get(position);
    viewHolder.number_tv.setText(bean.getNumber());
    String mode = bean.getMode();
    if ("1".equals(mode)){
        viewHolder.mode_tv.setText("电话拦截");
    }else if ("2".equals(mode)){
        viewHolder.mode_tv.setText("短信拦截");
    }else if ("3".equals(mode)){
        viewHolder.mode_tv.setText("全部拦截");
    }
    return convertView;
}

static class ViewHolder {
    TextView number_tv;
    TextView mode_tv;
    ImageView delete_iv;
}

}

package com.personal.fyd.blacknumber;

import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private final Context context = MainActivity.this;

    private ListView lv;
    private AlertDialog alertDialog;
    private NumberDao numberdao;
    private MyAdapter adapter;
    private List<NumberBean> list;
    private ImageView iv;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        updateLV();
    }

    private void updateLV() {
        list = numberdao.findAll();
        adapter = new MyAdapter(list,MainActivity.this);
        lv.setAdapter(adapter);
    }

    private void initView() {
        lv = (ListView) findViewById(R.id.lv);
        numberdao = new NumberDao(this);
        iv = (ImageView) findViewById(R.id.iv_delete);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                Toast.makeText(context,"再次点击删除此项",Toast.LENGTH_SHORT).show();
                view.findViewById(R.id.iv_delete).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String num = list.get(position).getNumber();
//                        Toast.makeText(context,num,Toast.LENGTH_SHORT).show();
                        numberdao.delete(num);
                        numberdao.findAll();
                        updateLV();
                    }
                });
            }
        });
    }
    public void delete(View view){

    }

    public void add(View view){
        showDiagle();
    }
    //显示对话框
    private void showDiagle(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        View view = View.inflate(this,R.layout.diagle,null);
        builder.setView(view);

        final EditText editText = (EditText) view.findViewById(R.id.blacknumber_et);
        final CheckBox call_cb = (CheckBox) view.findViewById(R.id.call_cb);
        final CheckBox sms_cb = (CheckBox) view.findViewById(R.id.sms_cb);
        Button commit = (Button) view.findViewById(R.id.commit_btn);
        Button cancel = (Button)view.findViewById(R.id.cancel_btn);

        commit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String number = editText.getText().toString();
                //判断是否为空
                if (TextUtils.isEmpty(number)){
                    Toast.makeText(MainActivity.this,"number ",Toast.LENGTH_SHORT).show();
                    return;
                }
                String mode;
                if (call_cb.isChecked()&&sms_cb.isChecked()){
                    mode = "3";
                }else if (call_cb.isChecked()){
                    mode = "1";
                }else if (sms_cb.isChecked()){
                    mode = "2";
                }else {
                    Toast.makeText(MainActivity.this,"请至少选择一种拦截方式",Toast.LENGTH_SHORT).show();
                    return;
                }
                //操作合法 插入数据
                numberdao.insert(number,mode);
                //插入成功  重新查询
                alertDialog.dismiss();
                updateLV();
            }
        });
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
            }
        });

        alertDialog = builder.create();
        alertDialog.show();
    }

}




3个回答

首先从list中删除数据,然后数据库什么的删除对应数据,完成以后适配器通知数据改变。贴的那么长。。。。汗。可以在适配器监听。

Mingyueyixi
Mingyueyixi 回复SnakePlant: 你可以试试楼下的代码。我只知道为什么会冲突。原因是安卓的事件分发传递的影响。
接近 3 年之前 回复
SnakePlant
SnakePlant 毕竟写了两个点击事件的监听,我想取消掉一个。最终的效果是想点击图片删除,点击其他的地方不做处理,长按item弹出对话框做修改处理
接近 3 年之前 回复
SnakePlant
SnakePlant 嗯, 这个之前试过了 可以 。 现在我想做的是怎么取消掉listview跟里面控件的点击冲突 ,之前试过了给控件添加focusable属性,但是发现并没有用。需要给focusable做代码处理吗?
接近 3 年之前 回复

内层点击事件和listview的item点击事件冲突就是在adapter引用的布局里面添加这样一句话android:descendantFocusability="blocksDescendants"注意要添加到根节点。
这句话的意思是,点到哪里算谁的,点到item里面的东西,如果它有点击就出发item里面的点击,如果没有点击出发item的点击。

问题解决了没?这个问题就是跟Touch有关的,事件的分发机制,如果你想要使用两个监听方式,,说真的,你这么写有点麻烦,最好就是在适配器里面设置监听,如果你一定想要在Activity里面做监听删除的话,那么你需要重写ListView,采用内部拦截点击事件的方式,就行了。但是看了你描述的,其实就只需要在适配器里面做个监听就行了,你如果是担心刷新,那么你那个list有remove和notify方法,刷新一下,很简单的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!