2016-05-14 146 views
0

我有一個Adapter類,其中包括一個OnClickListenerOnLongClickListenerOnClickListener工作正常,但OnLongClickListener不起作用。我沒有找出原因。我附上我的適配器類長點擊監聽器不起作用

class RemainderAdapter extends BaseAdapter implements Filterable{ 
    private Context context; 
    private ArrayList<AccountDetails> rList; 
    private AccountDetails aDetails; 
    DBHelper myDb; 
    ArrayList<AccountDetails> suggArray= new ArrayList<AccountDetails>(); 

    RemainderAdapter(Context context, ArrayList<AccountDetails> rList) { 
     this.context = context; 
     this.rList = rList; 
     this.suggArray = rList; 
     DBHelper myDb=new DBHelper(context); 
    } 

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

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

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

    class ViewItem { 
     private TextView aName,uName,circle,date; 
     ViewItem(View v) { 
      aName = (TextView) v.findViewById(R.id.aName); 
      uName = (TextView) v.findViewById(R.id.uName); 
      circle = (TextView) v.findViewById(R.id.circle); 
      date = (TextView) v.findViewById(R.id.date); 
     } 
    } 

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

     if(convertView==null){ 
      LayoutInflater inflater= (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView=inflater.inflate(R.layout.list_item,parent,false); 
      holder=new ViewItem(convertView); 
      convertView.setTag(holder); 
     }else{ 
      holder=(ViewItem) convertView.getTag(); 
     } 

     AccountDetails pd= suggArray.get(position); 
     holder.aName.setText(pd.getaName()); 
     holder.uName.setText(pd.getuName()); 
     holder.date.setText(pd.getDate().toString().substring(0, 10)); 
     holder.circle.setText(pd.getaName().toString().substring(0, 1)); 
     convertView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(context, ActivityFive.class); 
       aDetails = suggArray.get(position); 
       intent.putExtra("Obj", aDetails); 
       context.startActivity(intent); 

      } 
     }); 

     convertView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       new AlertDialog.Builder(context). 
         setTitle("Delete").setMessage("do Do you want Delete this item ?").setIcon(R.drawable.delete) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           aDetails = suggArray.get(position); 
           myDb.deleteRow(aDetails); 
           Log.e("Values", "Position : " + position + ", Account Value : " + suggArray.get(position).getaName()); 
            context.startActivity(new Intent(context, ActivityThree.class)); 
          } 
         }).setNegativeButton("No", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }).create().show(); 
       return true; 
      } 
     }); 

     return convertView; 
    } 

    public Filter getFilter() { 
     return mFilter; 
    } 

    public Filter mFilter = new Filter() { 
     @SuppressLint("DefaultLocale") 
     @Override 
     protected FilterResults performFiltering(final CharSequence constraint) { 

      String filterString = constraint.toString().toLowerCase(); 

      FilterResults results = new FilterResults(); 

      final ArrayList<AccountDetails> nlist = new ArrayList<AccountDetails>(); 

      String filterableString ; 
      if(constraint!=null && constraint.length()>0) { 
       for (AccountDetails accountDetails : rList) { 
        filterableString = accountDetails.getaName().toString(); 
        if (filterableString.toLowerCase().contains(filterString)) { 
         //Log.e("Values", "Model Value : "+filterableString + " , String Value : " + constraint); 
         nlist.add(accountDetails); 
        } 
       } 

       results.values = nlist; 
       results.count = nlist.size(); 
      }else{ 
       results.values = rList; 
       results.count = rList.size(); 
      } 
      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      suggArray = (ArrayList<AccountDetails>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 
} 

下面的代碼登錄Main_Activity.java

05-14 14:01:29.278 2977-2977/? E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.sushanta.reminderpwd, PID: 2977 
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.sushanta.reminderpwd.DBHelper.deleteRow(com.sushanta.reminderpwd.AccountDetails)' on a null object reference 
at com.sushanta.reminderpwd.RemainderAdapter$2$2.onClick(RemainderAdapter.java:95) 
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
05-14 14:01:44.162 1298-1334/? E/InputDispatcher: channel 'd47d530 com.sushanta.reminderpwd/com.sushanta.reminderpwd.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 
05-14 14:01:44.163 1298-1334/? E/InputDispatcher: channel '2301c89 com.sushanta.reminderpwd/com.sushanta.reminderpwd.ActivityThree (server)' ~ Channel is unrecoverably broken and will be disposed! 
05-14 14:01:44.163 1298-1334/? E/InputDispatcher: channel 'f9bf7de com.sushanta.reminderpwd/com.sushanta.reminderpwd.ActivityThree (server)' ~ Channel is unrecoverably broken and will be disposed! 
05-14 14:01:44.183 1298-2881/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa20cd6d0 
05-14 14:01:44.263 950-1004/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property 
05-14 14:26:48.692 1298-1314/? E/BluetoothAdapter: Bluetooth binder is null 
05-14 14:26:48.698 1298-1314/? E/KernelCpuSpeedReader: Failed to read cpu-freq 
java.io.FileNotFoundException: /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state: open failed: ENOENT (No such file or directory) 
at libcore.io.IoBridge.open(IoBridge.java:452) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:76) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:103) 
at java.io.FileReader. 
<init> 
(FileReader.java:66) 
at com.android.internal.os.KernelCpuSpeedReader.readDelta(KernelCpuSpeedReader.java:49) 
at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8002) 
at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) 
at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
at com.android.server.ServiceThread.run(ServiceThread.java:46) 
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
at libcore.io.Posix.open(Native Method) 
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
at libcore.io.IoBridge.open(IoBridge.java:438) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:76) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:103) 
at java.io.FileReader. 
<init> 
(FileReader.java:66) 
at com.android.internal.os.KernelCpuSpeedReader.readDelta(KernelCpuSpeedReader.java:49) 
at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8002) 
at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) 
at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
at com.android.server.ServiceThread.run(ServiceThread.java:46) 
05-14 14:26:48.699 1298-1314/? E/KernelUidCpuTimeReader: Failed to read uid_cputime 
java.io.FileNotFoundException: /proc/uid_cputime/show_uid_stat: open failed: ENOENT (No such file or directory) 
at libcore.io.IoBridge.open(IoBridge.java:452) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:76) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:103) 
at java.io.FileReader. 
<init> 
(FileReader.java:66) 
at com.android.internal.os.KernelUidCpuTimeReader.readDelta(KernelUidCpuTimeReader.java:71) 
at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8031) 
at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) 
at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
at com.android.server.ServiceThread.run(ServiceThread.java:46) 
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
at libcore.io.Posix.open(Native Method) 
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
at libcore.io.IoBridge.open(IoBridge.java:438) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:76) 
at java.io.FileInputStream. 
<init> 
(FileInputStream.java:103) 
at java.io.FileReader. 
<init> 
(FileReader.java:66) 
at com.android.internal.os.KernelUidCpuTimeReader.readDelta(KernelUidCpuTimeReader.java:71) 
at com.android.internal.os.BatteryStatsImpl.updateCpuTimeLocked(BatteryStatsImpl.java:8031) 
at com.android.server.am.BatteryStatsService.updateExternalStats(BatteryStatsService.java:1366) 
at com.android.server.am.BatteryStatsService$BatteryStatsHandler.handleMessage(BatteryStatsService.java:125) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.os.HandlerThread.run(HandlerThread.java:61) 
at com.android.server.ServiceThread.run(ServiceThread.java:46) 
+0

發佈你的logcat如果你得到任何錯誤 –

+0

是的。 @tynn – diya

+0

@Devendra,當我長時間點擊任何項目,然後點擊對話框按鈕,然後msg顯示不幸的應用程序已停止。 – diya

回答

0

在setOnLongClickListener調用deleteRow()之前初始化DBHelper對象 「MYDB」。

+0

,謝謝你的回答,內部它被刪除,但是當時沒有刷新列表。如果我從其他活動回來,那麼刷新項目 – diya

+0

調用setNotifyOnChange()方法刷新列表 –

+0

我之前聲明過,但它不起作用 – diya

1

嘗試,你提到的ListView。

ListView list = findViewById(R.id.listView); 
list.setOnLongClickListener(new View.OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 

     // put your code here. 

     return true; 
    } 

我希望這段代碼能幫到你。

0
更好

你應該使用onItemLongClickListenerlistView

listeView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

      return false; 
     } 
    }); 
0

根據你的日誌你會得到一個空指針。檢查以確保你的數據庫有數據。最有可能的不是,如果它是一個錯誤的位置,它會拋出索引超出界限例外。因此請檢查數據的初始化並確保其中包含內容。