2015-01-30 2 views
0

각 항목에 삭제 단추가있는 ListView가 있습니다. 데이터에서 제거 할 항목 (HashMaps의 ArrayList)을 단추로 누르고 ListView에서 닫을 때도 필요합니다. 여기 BaseAdapter를 사용하여 ListView를 새로 고칩니다.

내 코드입니다 :

BaseAdapter :

public class MyCustomAdapter extends BaseAdapter{ 

private ArrayList<HashMap<String, Object>> list; 

private Context context; 

public MyCustomAdapter(ArrayList<HashMap<String, Object>> list,Context context){ 

    this.list = list; 
    this.context = context; 
} 


@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(final int position, View convertView, ViewGroup parent) { 

    View view = convertView; 

    if(view == null){ 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     view = inflater.inflate(R.layout.addresslist_item, null); 



     TextView address = (TextView) view.findViewById(R.id.listtxtaddress); 

     String add = String.valueOf(list.get(position).get("address")); 

     address.setText(add); 

     Button btndelete = (Button) view.findViewById(R.id.listbtndelete); 

     btndelete.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.d("check", "item_positiona:"+position); 
       Log.d("check", "lista:"+list.toString()); 

       AlertDialog.Builder builder = new AlertDialog.Builder(context); 

       builder.setTitle("Τιτλος επιχειρησησης"); 

       builder.setMessage("Θέλετε να διαγάρψετε αυτή τη διεύθυνση;"); 

       builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         dialog.dismiss(); 

         Log.d("check", "item_positionb:"+position); 


         list.remove(position); 

         notifyDataSetChanged(); 


        } 
       }); 

       builder.setPositiveButton("AKYPO", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         dialog.dismiss(); 

        } 
       }); 

       AlertDialog abc = builder.create(); 

       abc.show(); 



      } 
     }); 


    } 

    return view; 


} 
} 

내 문제는 항목이 데이터에서 제거되지만이다의 ListView는 마지막 항목이 제거되고 갱신이 아닌 항목을 때 그 전 왜 이런 생각이 드는거야? 미리 감사드립니다.

답변

1

ArrayList이 변경된 후 notifyDataSetChanged()으로 전화하여 변경 사항을 ListView으로 업데이트해야합니다. 이 작업은 어댑터 내부 또는 외부에서 수행 할 수 있습니다. 따라서 예를 들어 : 당신은 데이터가 목록보기를 새로해야 수정 한 후

public class MyCustomBaseAdapter extends BaseAdapter { 
    //TIP: Don't make this static, that's just a bad idea 
    private ArrayList<Contact> searchArrayList; 

    private LayoutInflater mInflater; 

    public MyCustomBaseAdapter(Context context, ArrayList<Contact> initialResults) { 
     searchArrayList = initialResults; 
     mInflater = LayoutInflater.from(context); 
    } 

    public void updateResults(ArrayList<Contact> results) { 
     searchArrayList = results; 
     //Triggers the list update 
     notifyDataSetChanged(); 
    } 
} 
+0

의 다음 onclick을 어디에 정확히 내가 updateResults 메서드를 호출해야합니까? – user3734693

+0

OP 문제가 업데이트 목록보기가 아니므로 잘못된 항목이 삭제되어 유용하지 않습니다. – Rohit5k2

0

는 어댑터 개체에 notifyDataSetChanged()를 호출.

당신은 this-

이 어댑터 내부의 개인 클래스 ViewHolder 만들기 시도 할 수 있습니다. 이 클래스에는 목록 항목에있는 모든보기가 있어야합니다.

private static class ViewHolder { 
    TextView address; 
    String add; 
    Button btndelete; 
} 

그리고 다음의 getView() 내부

: 당신은이 방법을 시도 할 수 있습니다

 ViewHolder viewHolder; 
     if (convertView == null) {  
       viewHolder = new ViewHolder(); 
       LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
       convertView = layoutInflater.inflate(R.layout.addresslist_item, null); 
       viewHolder.address = (TextView) view.findViewById(R.id.listtxtaddress); 
       viewHolder.add = String.valueOf(list.get(position).get("address")); 
       viewHolder.address.setText(add); 

      viewHolder.btndelete = (Button) view.findViewById(R.id.listbtndelete); 
       convertView.setTag(viewHolder); 
    } 
    else 
    {     


    viewHolder = (ViewHolder) convertView.getTag(); 

    } 
    viewHolder.btndelete.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        Log.d("check", "item_positiona:"+position); 
        Log.d("check", "lista:"+list.toString()); 

        AlertDialog.Builder builder = new AlertDialog.Builder(context); 

        builder.setTitle("Τιτλος επιχειρησησης"); 

        builder.setMessage("Θέλετε να διαγάρψετε αυτή τη διεύθυνση;"); 

        builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          dialog.dismiss(); 

          Log.d("check", "item_positionb:"+position); 


          list.remove(position); 

          notifyDataSetChanged(); 


         } 
        }); 




    builder.setPositiveButton("AKYPO", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         dialog.dismiss(); 



        } 
       }); 

       AlertDialog abc = builder.create(); 

       abc.show(); 



      } 
     }); 


    } 
    } 
    return convertView; 
    } 
+0

업데이트 된 답변 코드를 확인하십시오! –

+0

죄송 합니다만 작동하지 않았습니다. 마지막 항목과 동일한 결과가 제거되었습니다. 이는 list.size() 만 줄이고 같은 데이터를 유지하는 것처럼 보입니다. – user3734693

+0

그러나 list.remove (position)를 호출하면 목록이 업데이트되지 않습니까? – user3734693

0

.. 리스트 뷰를 가지고 당신의 actvity/조각보다 리스너 인터페이스

package xyz.listeners; 

public interface DeleteClickListener { 

    public void onDeleteClick(int position); 

} 

만들기 -

private DeleteClickListener mDeleteClickListener; 
mDeleteClickListener = new DeleteClickListener() { 

      @Override 
      public void onDeleteClick(int position) { 

    list.remove(position); 
adapter.notifyDataSetChanged(); 
      } 
     }; 

어댑터 클래스 생성자에서 해당 수신기를 전달합니다.

public MyCustomAdapter(ArrayList<HashMap<String, Object>> list,Context context,DeleteClickListene mDeleteClickListener){ 

    this.list = list; 
    this.context = context; 
    deleteClickListener=mDeleteClickListener; 

} 

및 삭제 버튼

builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, int which) { 

           deleteClickListener.onDeleteClick(position); 




          } 
         }); 
+0

위의 코드에서 수정 된 사항이 없습니다. –

관련 문제