0

私はアンドロイドが初めてです。リストビューを更新しようとしています.uiスレッドでnotifydatasetchangedを呼び出すことから、単にリストアダプターを再作成することまで、すべてを試しましたが、更新時に何らかの理由で、使用する方法に関係なくスクロールして変更を確認します。これは、データが更新されることを意味します (たとえば、リストの 13:01 が 13:02 に変更されます)。更新されますが、変更を確認するには、13:01 が画面から消えてから戻るようにスクロールする必要があります。視覚的に更新されます。どうしてこれなの?(今は携帯電話にいるのでコードを投稿できませんが、必要に応じて後で投稿します。)

編集:関連するコードは次のとおりです...申し訳ありませんが、数日間コンピューターにアクセスしていませんでした。

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;
}
}
4

2 に答える 2

0

でコンテンツを表示および更新するには、次のListViewことを行う必要があります。

  1. 作成または検索ListView
  2. あなたのListAdapter
  3. あなたにあなたを追加ListAdapterしますListView
  4. にデータを追加するListAdapter
  5. あなたのを呼び出しnotifyDataSetChanged()ますListAdapter

例:

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

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

注:のサブクラスを使用している場合は、メソッド、などを使用ArrayAdapterするnotifyDataSetChanged()とが呼び出されます。add()addAll()

于 2013-03-06T22:11:39.990 に答える
0

アダプタを使用してリストを更新しようとしましたか?

dataadapter.clear();
dataadapter.addAll(allDataResult);
于 2013-03-06T22:10:17.330 に答える