2013-07-18 99 views
0

我有ListView其中我設置了ImageView,2 TextView和2 ImageButtonImageButtons用於添加和刪除listItem。
這裏是我的代碼...

Helper.java
如何使用arrayadapter和notifyDataSetChanged刪除ListView項目

import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
. 
. 
. 
import com.example.customObject.ContactBean; 
import com.example.helper.HelperAdaptor; 
import com.example.helper.ImageHelper; 

public class Helper extends Activity implements OnItemClickListener { 
    private List<ContactBean> list = new ArrayList<ContactBean>(); 
    private ListView listView; 
    private Button add_helper; 
    public HelperAdaptor objAdapter ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_helper); 

     listView = (ListView) findViewById(R.id.lstview_helper_helperlist); 
     listView.setOnItemClickListener(this); 
     add_helper = (Button) findViewById(R.id.btn_helper_addhelper); 
     add_helper.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), 
         ContactListActivity.class); 
       startActivityForResult(intent, SELECT_CONTACT); 
      } 
     }); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_CONTACT) { 

       ContactBean objContact = new ContactBean(); 
       objContact.setName(helperName); 
       objContact.setPhoneNo(helperNumber); 
       objContact.setPic(image); 
       list.add(objContact); 
       objAdapter = new HelperAdaptor(Helper.this, 
         R.layout.activity_helper_rows, list); 
       listView.setAdapter(objAdapter); 

      } 
     } 
    } 

    @Override 
    public void onItemClick(AdapterView<?> listview, View v, int position, 
      long id) { 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.helper, menu); 
     return true; 
    } 
} 

HelperAdapter.java

import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 
. 
. 
. 
import com.example.customObject.ContactBean; 
import com.example.helpmerestart.ContactListActivity; 
import com.example.helpmerestart.R; 

public class HelperAdaptor extends ArrayAdapter<ContactBean> { 

    private Activity activity; 
    private List<ContactBean> items; 
    private int row; 
    private ContactBean objBean; 
    private ViewHolder holder; 
    private int itemIndex; 
    private View view; 

    public HelperAdaptor(Activity act, int row, List<ContactBean> items) { 
     super(act, row, items); 

     this.activity = act; 
     this.row = row; 
     this.items = items; 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     view = convertView; 
     itemIndex = position; 
     if (view == null) { 
      LayoutInflater inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(row, null); 

      holder = new ViewHolder(); 
      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

     if ((items == null) || ((position + 1) > items.size())) 
      return view; 

     objBean = items.get(position); 

     holder.add = (ImageButton) view.findViewById(R.id.btn_helper_add); 
     holder.remove = (ImageButton) view.findViewById(R.id.btn_helper_remove); 

     if (holder.tvname != null && null != objBean.getName() 
       && objBean.getName().trim().length() > 0) { 
      holder.tvname.setText(Html.fromHtml(objBean.getName())); 
     } 
     if (holder.tvPhoneNo != null && null != objBean.getPhoneNo() 
       && objBean.getPhoneNo().trim().length() > 0) { 
      holder.tvPhoneNo.setText(Html.fromHtml(objBean.getPhoneNo())); 
     } 
     if (holder.profilepic != null && null != objBean.getPic()) { 
      holder.profilepic.setImageBitmap(objBean.getPic()); 
     } 

     holder.add.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       addHelper(); 
      } 

     }); 
     holder.remove.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       items.remove(itemIndex); 
    //trying to call notifyDataSetChanged() here 

      } 
     } 

     ); 
     return view; 
    } 

    public void addHelper() { 
     Intent intent = new Intent(activity.getApplicationContext(), 
       ContactListActivity.class); 
     activity.startActivityForResult(intent, SELECT_CONTACT); 
     holder.add.setClickable(false); 
     holder.remove.setClickable(true); 
    } 



    public class ViewHolder { 
     public TextView tvname, tvPhoneNo; 
     public ImageView profilepic; 
     public ImageButton add, remove; 
    } 
} 

問題是我不能夠刪除的listItem爲點擊刪除按鈕。你可以參考Previous post來理解我想要的東西。我試圖調用notdifyDataSetChanged()onClick()的刪除按鈕,但沒有得到如何做到這一點。

任何其他方法,我可以得到我的目的工作將被認爲。
Regards ..
Sourabh

+0

使用'objAdapter.remove(objectToRemove);'' – Blackbelt

+0

是ObjAdapter'在輔助類和'remove.setOnClickListner() '在HelperAdaptor中。我試圖從'remove.setOnClickListner()'通知。主要問題是在HelperAdaptor類中獲得'objAdaptor'引用。 – user2376920

+0

不,我不明白。你有HelperAdaptor,並且當你按下Remove時,你想從數據集中刪除一個項目? – Blackbelt

回答

1

您以錯誤的方式使用ArrayAdapter。不要保留你自己的項目列表(私人列表項目),因爲ArrayAdapter裏面有自己的項目列表。要向listView添加和刪除項目,請使用ArrayAdapter的add/addAll和remove方法。如果你希望它能正常工作,你應該總是使用ArrayAdapters方法來管理項目。

如果您不需要ArrayAdapter的功能,請擴展BaseAdapter。

P.S.你也有itemIndex/holder變量的問題。 P.P.S.你用Holder錯誤的方式。 (findViewByIds執行的每個getView調用)

有噸代碼中的錯誤的...

+0

可能有錯誤。我修改了[this](https://www.dropbox.com/s/mm3umgev99cvmbn/Android%20Contact%20ListView.rar)例子來製作ListView。你可以給我任何好的教程,我可以參考。 – user2376920

+0

這一個很好:http://www.piwai。info/android-adapter-good-practices/ – Leonidos

+0

我找不到自定義arrayadapter的好例子)google它。 – Leonidos

相關問題