SnakePlant 2016-10-19 14:11 采纳率: 0%
浏览 1039

小白求教 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条回答

  • Mingyueyixi 2016-10-19 15:36
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler