0

아래 코드에서 Name, Id 및 Quantity가 포함 된 Items 목록이있는 ListView가 있습니다. 행을 클릭하면이 값은 UpdateItemSelectedInListView() 메서드의 알림 매개 변수에 따라 업데이트되어야합니다. 그러나 내가 선택한 선과는 별도로 9 번줄 만 변경된 값을 가지고 있습니다.ListView가 잘못된 행의 값을 업데이트합니다.

활동 :

public class MainActivity : Activity 
{ 
    ListView _ListView; 

    AdapterItem _Adapter; 

    List<Item> _ListaItem = new List<Item>(); 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.Main); 

     CriaListView(); 
    } 

    private void CriaListView() 
    { 
     _ListView = FindViewById<ListView>(Resource.Id.listaItems); 

     _ListView.ItemClick += _ListView_ItemClick; 

     _ListView.Adapter = CriaAdapter(); 
    } 

    private AdapterItem CriaAdapter() 
    { 
     for (int i = 0; i < 15; i++) 
     { 
      _ListaItem.Add(new Item("Test Name",i)); 
     } 

     _Adapter = new AdapterItem(this, _ListaItem); 

     return _Adapter; 
    } 
    void _ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e) 
    { 
     _Adapter.UpdateItemSelectedInListView(e.Position, 5); 
    } 
} 

어댑터 :

당신은 GetView 방법에 다른 내부 _View.Tag = _HolderItem;를 이동해야
public class AdapterItem : BaseAdapter 
{ 

List<Item>  _ListaItem = new List<Item>(); 

Activity  _Activity; 

LayoutInflater _Inflate; 

ViewHolderItem _HolderItem; 

Boolean  _HasUpdate; 

int   _IdToUpDate; 

int   _NewQntd; 

int   _Position; 

public AdapterItem(Activity activity, List<Item> listaItem) 
{ 
    _Activity = activity; 

    _ListaItem = listaItem; 

    try 
    { 
     _Inflate = (LayoutInflater)_Activity.GetSystemService(Context.LayoutInflaterService); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 

View _View; 

public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent) 
{ 
    _View = convertView; 

    try 
    { 
     if (_View != null) 
      _HolderItem = _View.Tag as ViewHolderItem; 

     else 
     { 
      _View = _Activity.LayoutInflater.Inflate(Resource.Layout.LayoutItem, null); 

      _HolderItem = CriaViewHolder(); 
     } 

     PopulaViewHolder(position); 

     _View.Tag = _HolderItem; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 

    return _View; 
} 

private ViewHolderItem CriaViewHolder() 
{ 
    ViewHolderItem holderItem = new ViewHolderItem(); 

    holderItem.txtNameItem = _View.FindViewById<TextView>(Resource.Id.nameItem); 

    holderItem.txtIdItem = _View.FindViewById<TextView>(Resource.Id.idItem); 

    holderItem.txtqntItem = _View.FindViewById<TextView>(Resource.Id.totalInStock); 

    return holderItem; 
} 

private void PopulaViewHolder(int position) 
{ 
    _HolderItem.txtNameItem.Text = _ListaItem[position].nome; 

    _HolderItem.txtIdItem.Text = _ListaItem[position].id.ToString(); 

    if (_HasUpdate && (position == _Position)) 
     UpdateAdapter(); 
} 

public void UpdateAdapter() 
{ 
    _HolderItem.txtqntItem.Text = _NewQntd.ToString(); 

    _HasUpdate = false; 
} 

public void UpdateItemSelectedInListView(int position, int newValue) 
{ 
    _NewQntd = newValue; 

    _HasUpdate = true; 

    _Position = position; 

    this.NotifyDataSetChanged(); 
} 

public override Java.Lang.Object GetItem(int position) 
{ 
    return 0; 
} 

public override int Count 
{ 
    get {return _ListaItem.Count; } 
} 

public override long GetItemId(int position) 
{ 
    return _ListaItem[position].id; 
} 

public override int GetItemViewType(int position) 
{ 
    return base.GetItemViewType(position); 
} 

public override int ViewTypeCount 
{ 
    get 
    { 
     return base.ViewTypeCount; 
    } 
} 

private class ViewHolderItem : Java.Lang.Object 
{ 
    public TextView txtNameItem { get; set; } 
    public TextView txtIdItem { get; set; } 
    public TextView txtqntItem { get; set; } 
} 

} 

답변

0

:

public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent) 
{ 
    _View = convertView; 

    try 
    { 
     if (_View != null) 
      _HolderItem = _View.Tag as ViewHolderItem; 

     else 
     { 
      _View = _Activity.LayoutInflater.Inflate(Resource.Layout.LayoutItem, null); 

      _HolderItem = CriaViewHolder(); 

      //Set the tag only when you create a new one 
      //otherwise you'll have the problem you are having 
      _View.Tag = _HolderItem; 
     } 

     PopulaViewHolder(position); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 

    return _View; 
} 
+0

망가 작업 :( – noNerd

0

그것은 당신의 _Adapter.UpdateItemSelectedInListView 보인다 느슨한만큼 올바른 위치를 가져 오지 못함 전자 상태. 대신 뷰 소유자 클래스의 각 뷰 행에 바인딩 "이벤트 동작"을 사용할 수 있습니다. [GetView()에서]이 작업 이벤트를 트리거 할 때 Click 이벤트를 처리 할 활동 클래스에 다른 이벤트 작업이 있습니다.

//Viewholder class  
internal Action ActionImgViewSelectedToGetView{ get; set;} 
     internal void Initialize(View view) 
     { 
     imgItem=view.FindViewById<ImageView> (Resource.Id.imgItem); 
     imgItem.Click += delegate(object sender , EventArgs e) 
     { 
     ActionImgViewSelectedToGetView(); //action event to getview() 
     }; 
     } 

//의 getView()에서

viewHolder.ActionImgViewSelectedToGetView =() => 
    { 
    if(ActionImgSelectedToActivity!=null) 
    ActionImgSelectedToActivity(_lstItem[position].ItemName); //action event,targeting to activity class method 
    }; 

자세한 내용에 대한 // 활동

if (objItemAdapter != null) 
    { 
    objItemAdapter.ActionImgSelectedToActivity -= SelectedItem; 
    objItemAdapter = null; 
    } 
    objItemAdapter = new ItemAdapterClass (this, lstItem); 
    objItemAdapter.ActionImgSelectedToActivity += SelectedItem; 
    listViewItem.Adapter = objItemAdapter; 

void SelectedItem(string strItemName) 
     { 
      //seleced item 
     } 

: 나를 위해 http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#WrongPosition

관련 문제