【问题标题】:Android Listview Scrolling inserts duplicate recordsAndroid Listview Scrolling 插入重复记录
【发布时间】:2015-04-13 08:45:19
【问题描述】:

我创建了一个具有 EditText 框的自定义列表视图。当我更改 EditText 中的文本时,我正在将该字段更新为数据库。它工作正常。

我面临的问题是当我滚动列表时,记录被添加到数据库中(重复记录)......我觉得这个问题可以通过在 ListView 滚动期间删除 EditText 焦点来解决,我不知道如何去做吧。否则,如果有人能提供更好的想法,那将是有帮助的。

这是我的 ListAdapter 代码

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;


public class ZoneListAdapter extends ArrayAdapter<Zone> {

protected static final String LOG_TAG = ZoneListAdapter.class.getSimpleName();
private PfDatabase db;

private List<Zone> items;
private int layoutResourceId;
private Context context;
int companyid;
public ZoneListAdapter(Context context, int layoutResourceId, List<Zone> items, int companyid) {
    super(context, layoutResourceId, items);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.items = items;
    this.companyid=companyid;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ZoneHolder holder = null;

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);

    holder = new ZoneHolder();
    holder.zoneList = items.get(position);


    holder.Label = (EditText)row.findViewById(R.id.txtLable);
    holder.iCount = (TextView)row.findViewById(R.id.FirstText);
    holder.dbid = (TextView) row.findViewById(R.id.dbid);

    setZoneLabelTextChangeListener(holder);


    row.setTag(holder);

    setupItem(holder);
    return row;
}

private void setupItem(ZoneHolder holder) {
    holder.Label.setText(holder.zoneList.getLabel());
    holder.iCount.setText(holder.zoneList.getCounter()+"");
}

public static class ZoneHolder {
    Zone zoneList;
    EditText Label;
    TextView iCount;
    TextView dbid;
}

private void setZoneLabelTextChangeListener(final ZoneHolder holder) {
    holder.Label.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //holder.zoneList.setLabel(s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void afterTextChanged(Editable s) {
            holder.zoneList.setLabel(s.toString());
            db = new ProfireDatabase(context);
            String strDBID = holder.dbid.getText().toString();
            Log.d("DBID",strDBID);
            if(strDBID.equals("TextView")){ //Insert New Record
                db.insertZone(companyid, s.toString());
                Cursor getId = db.myQuery("SELECT _id from zone order by _id DESC limit 1");
                int CompanyID = getId.getInt(0);
                holder.dbid.setText(""+CompanyID);
            } else { //Update Record
                int iRowId = Integer.parseInt(strDBID);
                Log.d("ROW ID",iRowId+"");
                db.updatezone(iRowId, s.toString());
            }
        }
    });
}

}

在我的活动中,我正在像这样加载 ListView

if (strAction != null && strAction.equals("new")){
        //For New Records
        istrID = Integer.parseInt(strID);
        ZoneListView.setAdapter(zadapter);
    } else {
        //Loading the records from database for the company id
        ZoneListView.setAdapter(zadapter);
            istrID = Integer.parseInt(strID);
            Cursor getZone = db.myQuery("Select * from zone where companyid="+istrID);
            if (getZone != null) {
                while(getZone.moveToNext()) {
                    zadapter.insert(new Zone(getZone.getString(1),getZone.getInt(0)), 0);
            }
                getZone.close();
    }
}

我面临的问题是,当我从数据库加载记录时,由于 EditText 焦点移动,因为记录被插入到数据库中(即使在列表视图滚动期间也是如此)。

我想知道如何避免重复记录被插入到数据库中

【问题讨论】:

    标签: android sqlite listview android-listview android-adapter


    【解决方案1】:

    正如您现在,每当用户上下滚动列表时,都会调用 getView()。 我实际上不知道确切的要求,但是您应该在单击 Editbox 时设置 TextWatcher 侦听器。它会做的是,它不会在用户上下滚动时调用您的 TextWatcher。 当您在编辑框的 onClickListener 上添加 TextWatcher 时,您可以在完成编辑后移除编辑框的焦点。

    【讨论】:

      【解决方案2】:

      你的问题不在于EditText 变得专注。这是关于每次调用 getView 时都会调用您的 TextWatcher

      解决此问题的一种简单方法是在getView 更改文本之前删除TextWatcher,稍后再添加,这意味着您需要保留对TextWatcher 的引用

      顺便说一句,您代码中的另一个问题是您使用错误的支架。

      如下编辑您的代码。

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          View row = convertView;
          ZoneHolder holder = null;
          if(row == null){
              LayoutInflater inflater = ((Activity) context).getLayoutInflater();
              row = inflater.inflate(layoutResourceId, parent, false);
              holder = new ZoneHolder();
              holder.Label = (EditText)row.findViewById(R.id.txtLable);
              holder.iCount = (TextView)row.findViewById(R.id.FirstText);
              holder.dbid = (TextView) row.findViewById(R.id.dbid);
      
              row.setTag(holder);
          }else{
              holder = (ZoneHolder) row.getTag();
          }
      
          holder.zoneList = items.get(position);
      
          if(holder.watcher != null){
               holder.Label.removeTextChangedListener(holder.watcher);
          }
      
          setupItem(holder);
      
          holder.Label.addTextChangedListener(/* Your watcher goes here */);
      
          return row;
      }
      
      private void setupItem(ZoneHolder holder) {
          holder.Label.setText(holder.zoneList.getLabel());
          holder.iCount.setText(holder.zoneList.getCounter()+"");
      }
      
      public static class ZoneHolder {
          Zone zoneList;
          EditText Label;
          TextView iCount;
          TextView dbid;
          TextWatcher watcher;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多