1

画像とともにテキストを表示するカスタムリストビューを実装しました。リストビューは、インターネット上に存在するXMLデータからデータをフェッチします。ユーザーが下にスクロールすると、より多くのデータがアプリケーションに読み込まれます。現在、ユーザーがデータを検索したときに、検索によって返された結果がアプリケーションに表示されるように、検索バーを含めようとしています。主な問題は、検索の実行時にリストビューに正しいデータが表示されないことです。

ブラウザの検索バーで実行されているURLを確認すると、正しい結果が表示されますが、Androidアプリケーションでは動作が異なります。

以下は、この作業全体を実行する私のアクティビティのコードです:-

public class OrganizationActivity extends Activity implements OnScrollListener {

int itemsPerPage = 10;
boolean loadingMore = false;
int mPos=0;

// All static variables
static final String URL = "some URL";
static int page_no = 1;

// XML node keys
static final String KEY_ORGANIZATION = "organization"; // parent node
static final String KEY_ID = "id";
static final String KEY_NAME = "name";
static final String KEY_CITY = "city";
static final String KEY_STATE = "state";
static final String KEY_IMAGE_URL = "image";

ListView list;
LazyAdapter adapter;
ArrayList<HashMap<String, String>> orgsList = new ArrayList<HashMap<String, String>>();
private EditText filterText = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    filterText = (EditText) findViewById(R.id.search_box_et);
    filterText.addTextChangedListener(new TextWatcher() 
    {
        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
            if(arg0.length()==0)
            {
                list.setAdapter(new LazyAdapter(OrganizationActivity.this, orgsList));
            }
            list.setAdapter(new LazyAdapter(OrganizationActivity.this, orgsList));
            String searchtext = null;
            try {
                searchtext=URLEncoder.encode(arg0.toString().trim(),"UTF-8");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String urlStr = "myURL?search="+searchtext;
            new LoadData().execute(urlStr);
            adapter = new LazyAdapter(OrganizationActivity.this, orgsList);
            list.setAdapter(adapter);
        }

    });

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_ORGANIZATION);
    // looping through all organization nodes <organization>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
        map.put(KEY_CITY, parser.getValue(e, KEY_CITY));
        map.put(KEY_STATE, parser.getValue(e, KEY_STATE));
        map.put(KEY_IMAGE_URL, parser.getValue(e, KEY_IMAGE_URL));

        // adding HashList to ArrayList
        orgsList.add(map);
    }

    list = (ListView) findViewById(R.id.list);

    View footerView = ((LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.listfooter, null, false);
    list.addFooterView(footerView);

    // Getting adapter by passing xml data ArrayList
    adapter = new LazyAdapter(this, orgsList);
    list.setAdapter(adapter);
    list.setOnScrollListener(this);

    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

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

            String name = orgsList.get(position).get(KEY_NAME).toString();
            Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG)
                    .show();
        }
    });

}


private class LoadData extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {

        for (String url : urls) {
            // TODO Auto-generated method stub
            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(url); // getting XML from URL
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_ORGANIZATION);
            // looping through all organization nodes <organization>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
                map.put(KEY_CITY, parser.getValue(e, KEY_CITY));
                map.put(KEY_STATE, parser.getValue(e, KEY_STATE));
                map.put(KEY_IMAGE_URL, parser.getValue(e, KEY_IMAGE_URL));

                // adding HashList to ArrayList
                orgsList.add(map);
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        adapter = new LazyAdapter(OrganizationActivity.this, orgsList);
        list.setAdapter(adapter);
        list.setSelectionFromTop(mPos, 0);
    }
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

    //Get the visible item position
    mPos=list.getFirstVisiblePosition();

    int lastInScreen = firstVisibleItem + visibleItemCount;

    //Is the bottom item visible & not loading more already? Load more !
    if ((lastInScreen == totalItemCount) && !(loadingMore)) {
        page_no++;
        String pageURL = "myURL?page="
                + page_no;
        new LoadData().execute(pageURL);
    }

}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    // TODO Auto-generated method stub

}

}

この問題の解決策を見つけるのを手伝ってください...

4

1 に答える 1

0

ListViewを新しいデータで更新する際に少し間違えたようです。また、notifyDataSetListenerを別の場所で呼び出していました。今では完全に正常に動作しています。

于 2012-08-21T12:06:17.853 に答える