총 게시물 934건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

ListView 내용 갱신..

글쓴이 : KuRoN 날짜 : 2018-05-24 (목) 13:52 조회 : 178
글주소 : http://www.androidside.com/B49_best/12990
 
  XAMARIN 교보문고
온라인서점, e-교환권 최대 9천원+간편결제/카드혜택 8만6천원, 바로드림 배송!
www.kyobobook.co.kr
  하반기 기대작, 진제천대성
생생한 서유기 판타지RPG!, 고품격 이야기의 대형MMORPG의 서막!
son.topgame.kr
  여신의 탄생, 여신세계
여신들의 전쟁이 시작된다! 야구여신 조연주가 선택한 풀3D 웹 RPG 여신세계
god.noblegames.kr/
신청하기



참고로 말씀드리자면, 현재 제 코드는 Xamarin 용 코드입니다.
안드로이드 스튜디오랑 크게 다를 건 없습니다.
Xamarin 이지만 안드로이드 스튜디오용으로 답변을 주셔도
전혀 문제 없고 오히려 감사드립니다... ㅠ





먼저 현재 만들고자 하는 이벤트입니다.

다음은 현재 코드입니다.




            int _Position = 0;
            string[] _Test_ListView_tow = { "OFF", "1", "2" };

            string[] _Set_RD_Data = { _Test_ListView_tow[_Position], "Display" };
            
            ListView _Test_ListView = FindViewById<ListView>(Resource.Id._Test_ListView);
            ArrayAdapter<string> lstAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, _Set_RD_Data);
            _Test_ListView.Adapter = lstAdapter;


            _Test_ListView.ItemClick += (s, e) =>
            {
                switch(e.Position)
                {
                    case 0:
                        if (_Position < 3)
                        {
                            _Position++;
                            lstAdapter.NotifyDataSetChanged();
                        }

                        else if (_Position > 2)
                        {
                            _Position = 0;
                        }
                        break;
                }
            };


현재 코드는 이렇습니다.
제가 알기로는 lstAdapter.NotifyDataSetChanged(); 이 부분에서 갱신을 시켜주는 걸로 알고 있는데
왜 갱신이 되지 않는걸까요?ㅠ



KuRoN 님의 개발 Q&A FAQ 최신글 [더보기]


질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

안사 이쁜이 2018-05-24 (목) 13:52
축하드립니다. ;)
KuRoN님은 안사 이쁜이에 당첨되어 5 포인트 지급되었습니다.
뉴키 2018-05-24 (목) 14:12
lstAdapter의 내용을 바꾸신 게 없는데 뭘 갱신하신다는 거죠?

NotifyDataSetChanged 는 배열에 변화가 있을 때 갱신하는 기능입니다. 원하시는 게 정확히 뭔지 소스상으로는 모르겠네요.
댓글주소 추천 0 반대 0
     
     
KuRoN 2018-05-24 (목) 16:46
[@뉴키]


            int _Position = 0;
            string[] _Test_ListView_tow = { "OFF", "1", "2" };

            string[] _Set_RD_Data = { _Test_ListView_tow[_Position], "Display" };
            
            ListView _Test_ListView = FindViewById<ListView>(Resource.Id._Test_ListView);
            ArrayAdapter<string> lstAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, _Set_RD_Data);
            _Test_ListView.Adapter = lstAdapter;


            _Test_ListView.ItemClick += (s, e) =>
            {
                switch(e.Position)
                {
                    case 0:
                        if (_Position < 2)
                        {
                            _Position++;
                            _Set_RD_Data[0] = _Test_ListView_tow[_Position];
                            lstAdapter.NotifyDataSetChanged();
                        }

                        else if (_Position == 2)
                        {
                            _Position = 0;
                        }
                        break;
                }
            };


죄송합니다 문장 하나를 빼먹었네요.
현재 이 상태인데, 로그로는 변하는게 찍힙니다.
그런데, 외관적으로 보이는 ListView의 글이 바뀌지는 않더라구요...ㅠ
댓글주소 추천 0 반대 0
어비서 2018-05-25 (금) 09:52
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.abyser.R;

public class ListView_Sample_Activity extends Activity implements OnItemClickListener, OnItemLongClickListener{

private static final String LOG_TAG = "ListView_Sample_Activity";

private ListView lv;
private ArrayAdapter<String> lv_SimpleAdapter;

private int mClickCount; // _Position과 같은 변수
private String[] mChangeStrs; // _Test_ListView_tow와 같은 변수
private String[] mListDatas; // _Set_RD_Data와 같은 변수

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

initValue();
initLayout();

}

private void initValue(){

mClickCount = 0;
mChangeStrs = new String[]{ "OFF", "1", "2" };
mListDatas = new String[]{ mChangeStrs[mClickCount], "Display" };

}

private void initLayout(){

lv = (ListView)findViewById(R.id.listview_lv);

lv_SimpleAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListDatas);
lv.setAdapter(lv_SimpleAdapter);
lv.setOnItemClickListener(this);
lv.setOnItemLongClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Toast.makeText(this, "List item click position : " + position + ", something : " + lv_SimpleAdapter.getItem(0) + " change to " + mChangeStrs[mClickCount == 2 ? 0 : mClickCount + 1], Toast.LENGTH_SHORT).show();

if(position == 0) {

if (mClickCount < 2) {
mClickCount++;
} else if (mClickCount == 2) {
mClickCount = 0;
}

mListDatas[0] = mChangeStrs[mClickCount];
lv_SimpleAdapter.notifyDataSetChanged();

}

}

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

Toast.makeText(this, "List item long click position : " + position, Toast.LENGTH_SHORT).show();

return true;

}

}
댓글주소 추천 0 반대 0
     
     
어비서 2018-05-25 (금) 10:31
[@어비서]
일단 저는 되는데 결과 좀 알려주세요 ; 
Xamarin은 잘 몰라서 결과를 알고싶네요.
댓글주소 추천 0 반대 0
          
          
KuRoN 2018-05-25 (금) 14:53
[@어비서] 답글 감사합니다.
Xamarin 에서의 결과를 보여드리겠습니다.

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Views;
using System;
using System.Collections.Generic;
using Android.Util;

namespace TestListViewClickEvent
{
    [Activity(Label = "TestListViewClickEvent", MainLauncher = true)]
    public class MainActivity : Activity
    {
        private int _Position;
        private String[] _Test_ListView_tow; 
        private String[] _Set_RD_Data;

        private ListView _Test_ListView;
        private ArrayAdapter<string> lstAdapter;


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

            SetContentView(Resource.Layout.Main);
            initValue();
            initLayout();
        }

        private void initValue()
        {
            _Position = 0;
            _Test_ListView_tow = new string[] { "TX1", "TX2", "TX3" };
            _Set_RD_Data = new string[] { _Test_ListView_tow[_Position], "Display" };
        }

        private void initLayout()
        {
            _Test_ListView = FindViewById<ListView>(Resource.Id._Test_ListView);
            lstAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, _Set_RD_Data);
            _Test_ListView.Adapter = lstAdapter;

            _Test_ListView.ItemClick += _Test_ListView_ItemClick;

        }

        private void _Test_ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            if (e.Position == 0)
            {
                if (_Position < 2)
                {
                    _Position++;
                }
                else if (_Position == 2)
                {
                    _Position = 0;
                }

                _Set_RD_Data[0] = _Test_ListView_tow[_Position];
                lstAdapter.NotifyDataSetChanged();
                Console.WriteLine("현재 데이터 : " + _Set_RD_Data[0].ToString());
            }
        }
    }
}


보여주신 코드 그대로 사용해봣구요

상황은

1.jpg

2.jpg

보시는것처럼 로그를 봣을 때에는 데이터의 변경이 보입니다만,
ListVIew 의 보이는 목록은 변경이 되질 않습니다.


댓글주소 추천 0 반대 0
               
               
어비서 2018-05-25 (금) 16:25
[@KuRoN]
음 ... 제 생각에는 어뎁터에 들어간 데이터가 어뎁터에서 따로 데이터가 저장 되면서 변수 참조를 못해서 안바뀌는거 같다고 생각이 드네요.

제가 작성했던 코드 기준으로 다시 작성해 드릴게요.
이렇게 한번 해보시겠어요 ?

기존
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Toast.makeText(this, "List item click position : " + position + ", something : " + lv_SimpleAdapter.getItem(0) + " change to " + mChangeStrs[mClickCount == 2 ? 0 : mClickCount + 1], Toast.LENGTH_SHORT).show();

if(position == 0) {

if (mClickCount < 2) {
mClickCount++;
} else if (mClickCount == 2) {
mClickCount = 0;
}

mListDatas[0] = mChangeStrs[mClickCount];
lv_SimpleAdapter.notifyDataSetChanged();

}

}

수정
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Toast.makeText(this, "List item click position : " + position + ", something : " + lv_SimpleAdapter.getItem(0) + " change to " + mChangeStrs[mClickCount == 2 ? 0 : mClickCount + 1], Toast.LENGTH_SHORT).show();

if(position == 0) {

if (mClickCount < 2) {
mClickCount++;
} else if (mClickCount == 2) {
mClickCount = 0;
}

mListDatas[0] = mChangeStrs[mClickCount];
         lv_SimpleAdapter.clear();
         lv_SimpleAdapter.addAll(mListDatas);
lv_SimpleAdapter.notifyDataSetChanged();

}

}

댓글주소 추천 0 반대 0
                    
                    
KuRoN 2018-05-25 (금) 16:35
[@어비서] 감사합니다 그런데 이 방법도 제가 해봤습니다만, Xamarin이 문제인지 제가 코드를 잘못 넣었던건지 일단 AddAll 부분에서 계속 에러가 발생합니다.
다음은 에러 내용입니다.

오류 CS0121 'ArrayAdapter.AddAll(ICollection)' 및 'ArrayAdapter.AddAll(params Object[])'의 메서드 또는 속성 간 호출이 모호합니다.

라는 에러가 발생합니다. 이게 도대체 뭔가 싶어서 하루 정도 날잡고 찾아봣는데도 발견을 하지 못했어요...
lv_SimpleAdapter.AddAll((string[]) mListDatas)); 로도 해봣지만 역시 마찬가지인 오류가 발생하더라구요..

댓글주소 추천 0 반대 0
에찌 2018-05-25 (금) 10:04
어디서 로그를 찍으신건가요..?
ListView 의 글이 바뀌지않았다는 것은 바뀐내용이 없어서 그런거같은데요..?
setAdapter 도 없고..
댓글주소 추천 0 반대 0
     
     
KuRoN 2018-05-25 (금) 14:54
[@에찌] 아 답글에는 없었지만, Switch 내에서 사용하였습니다.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기