2013-03-06 2 views
0

나는 안드로이드에 새로운 해요. 난 그냥 간단하지만 무엇이든 내가 업데이트 이유에 상관없이 어떤 방법을 내가 가지고 사용하지 내 목록 어댑터를 재현하기 위해 UI 스레드에서 notifydatasetchanged 호출하는 ... 내 목록보기, 나는 모든 노력을했습니다 업데이트하려고 노력하고있어 변경 사항을 보려면 스크롤하십시오. 이것에 의하여 나는 데이터 업데이트 (예를 들어 목록에 13시 2분부터 13시 1분까지 변경)가 업데이트됩니다,하지만 난 다시 이동 한 후 이렇게 스크롤 13시 1분 화면을가는 것을하고있는 변화를 볼 수 있으며 것을 의미 시각적으로 업데이트됩니다. 이유가 무엇인가요? (나는 지금 내 전화를 해요하지만 필요한 경우 나중에 게시 할 예정으로 코드를 게시 할 수 없습니다.)왜 내 목록보기를 새로 고치려면 스크롤해야합니까?

편집 : 여기에 관련 코드는 ... 너무 오래 걸려서 미안 해요은 없었다 내 컴퓨터를 며칠 동안. ListFragment의

관련 부품 :

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    super.onCreateView(inflater, container, savedInstanceState); 

    return inflater.inflate(R.layout.match_fragment, container, false); 
} 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    MatchAdapter adapter = (MatchAdapter) this.getListAdapter(); 

    if(futureMatches) 
     adapter = new MatchAdapter (this.getActivity(), ((MainActivity)this.getActivity()).getMatches(), futureMatches); 
    else 
     adapter = new MatchAdapter (this.getActivity(), ((MainActivity)this.getActivity()).getPastMatches(), futureMatches); 

    setListAdapter(adapter); 
} 

public void refresh() 
{ 
    MatchAdapter adapter; 

    //Update array in mainactivity 
    if(futureMatches) 
     MainActivity.refreshMatches((MainActivity) getActivity()); 
    else 
     MainActivity.refreshPastMatches((MainActivity) getActivity()); 

    //put updated entries in the adapter 
    if(futureMatches) 
     adapter = new MatchAdapter (getActivity(), ((MainActivity)getActivity()).getMatches(), futureMatches); 
    else 
     adapter = new MatchAdapter (getActivity(), ((MainActivity)getActivity()).getPastMatches(), futureMatches); 

    setListAdapter(adapter); 
    updateList(); 
} 

public void updateList(){ 

    this.getActivity().runOnUiThread(new Runnable() { 

     public void run() { 
      ((BaseAdapter) getListAdapter()).notifyDataSetChanged(); 
      getListView().refreshDrawableState(); 
      getListView().invalidate(); 
     } 
    }); 
} 

public void onViewStateRestored(Bundle savedInstanceState) 
{ 
    super.onViewStateRestored(savedInstanceState); 
} 

public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 
    refresh(); 
} 

내 어댑터 클래스 :

public class MatchAdapter extends BaseAdapter 
{ 
private final Activity context; 
private LayoutInflater inflater; 
private boolean time = false; 
private boolean futureMatchAdapter = true; 
private ArrayList<String> matchList; 

public MatchAdapter(Context cont, ArrayList<String> matches, boolean isFutureMatchAdapter) 
{ 
    matchList = matches; 
    futureMatchAdapter = isFutureMatchAdapter; 
    context = (Activity) cont; 
    inflater = LayoutInflater.from(context); 
} 

public int getCount() 
{ 
    return MatchAdapter.size(); 
} 

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

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

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 
    String curPos = ""; 
    curPos = MatchAdapter.get(position); 

    //times, future matches and past matches are handled differently 
    if(curPos.contains("Last updated:")) 
     time = true; 
    else 
     time = false; 

    if (convertView == null) 
    { 
     holder = new ViewHolder(); 
     if(time) 
     { 
      convertView = inflater.inflate(R.layout.time_item, null); 
      holder.title = (TextView) convertView.findViewById(R.id.item_time); 
     } 
     else 
     { 
      if(futureMatchAdapter) 
      { 
       convertView = inflater.inflate(R.layout.feed_item, null); 
       holder.title = (TextView) convertView.findViewById(R.id.item_title); 
      } 
      else 
      { 
       convertView = inflater.inflate(R.layout.past_feed_item, null); 
       holder.title = (TextView) convertView.findViewById(R.id.item_title_past); 
      } 
     } 

     convertView.setTag(holder); 
    } 
    else 
     holder = (ViewHolder) convertView.getTag(); 


    if(futureMatchAdapter) 
     holder.title.setText(matchList.get(position)); 
    else 
    { 
     String matchString = matchList.get(position); 

     String alwaysVisible = matchString.replace("<", "vs"); 
     alwaysVisible = alwaysVisible.replace(">", "vs"); 

     if(!time) 
      alwaysVisible = alwaysVisible.substring(0, alwaysVisible.length() - 1); 

     holder.title.setText(alwaysVisible); 

     if(matchString.contains(">")) 
     { 
      String winner = matchString.substring(0, matchString.indexOf(">")) + "won!"; 
      alwaysVisible = alwaysVisible.concat(winner); 
     } 
     else if(matchString.contains("<")) 
     { 
      String winner = matchString.substring(matchString.indexOf("<") + 2, matchString.indexOf("\n")) + " won!"; 
      alwaysVisible = alwaysVisible.concat(winner); 
     }  

     holder.title.setOnClickListener(new pastMatchesOnclickListener(alwaysVisible) 
     { 
      public void onClick(View v) 
      { 
       ((TextView) v).setText(matchWinner); 
      } 
     }); 
    } 

    return convertView; 
} 

static class ViewHolder 
{ 
    TextView title; 
    TextView time; 
} 
} 

답변

0

이 어댑터를 사용하여 목록을 업데이트하려고 했습니까?

dataadapter.clear(); 
dataadapter.addAll(allDataResult); 
0

보여줄과 ListView의 업데이트 내용에 당신이해야 :

  1. 만들거나 찾을 수 귀하의 ListView
  2. 당신의 ListAdapter
  3. ListView
  4. 가 데이터를 추가하여 ListAdapter에 추가 만들기 당신의 ListAdapter
  5. ListAdapternotifyDataSetChanged()으로 전화하십시오.

예 :

ListView listView = (ListView) findViewById(R.id.listview); 
MyListAdapter myListAdapter = new MyListAdapter(); 
listView.setAdapter(myListAdapter); 

myListAdapter.add("Hello"); 
myListAdapter.add("Hi"); 
myListAdapter.notifyDataSetChanged(); 

참고 : ArrayAdapternotifyDataSetChanged()의 서브 클래스를 사용하는 경우 내가 뭐하는 거지 add(), addAll()

+0

당신이 방법을 사용할 때 요구됩니다 정확히,이 새로운 데이터를 어댑터에 전달한 다음 추가하고 notifydatasetchanged를 호출하는 것을 제외하고는. 기본 어댑터에서 확장 한 사용자 지정 어댑터를 사용하고 있습니다. 그 어댑터와 관련이있을 수 있습니까? 편집 : 당신은 다시 어댑터를 추가해야한다 – HatInACat

+0

와 오 나는 listfragment을 사용하고 있습니다. 또한'ListFragment'를 사용해서는 안됩니다. 기회가 생기면 코드를 추가 할 수 있습니다. – nhaarman

관련 문제