Во-первых, вам необходимо представление списка, так
private volatile ArrayList<String> searchResults;
ListView searchList = (ListView) findViewById(R.id.listYOURLISTVIEW);
listAdapter = new ArrayAdapter<String>(this, R.layout.blacklist, R.id.list_content, searchResults); //blacklist is a layout to paint the fonts black
searchList.setAdapter(listAdapter);
Вот что может помочь.
private Thread refreshThread;
private boolean isRefreshing = false;
private void reinitializeRefreshThread()
{
if (!refreshThread.equals(null)) refreshThread.stop();
Log.d(LOGTAG+"::reinitializeRefreshThread()", "Creating new thread!\n");
isRefreshing = true;
refreshThread = (new Thread(new Runnable()
{
public void run()
{
Looper.prepare();
while (isRefreshing)
{
//GRAB YOUR SEARCH RESULTS HERE
//make sure the methods are synchronized
//maybe like
String[] results = grabResults(); //doesn't need to be synchronized
addResultList(results);
Message message = myHandler.obtainMessage();
myHandler.sendMessage(message);
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
Log.d(LOGTAG+"->refreshThread", "Refresh finished!\n");
}
}
}));
Log.d(LOGTAG+"::reinitializeRefreshThread()", "Refresh thread started!\n");
refreshThread.start();
}
final Handler myHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
listAdapter.notifyDataSetChanged();
};
};
где
public synchronized void addResultList(String[] results)
{
// remove the whole list, repopulate with new data
searchResults.clear();
for (int i = 0; i < results.length; i++)
{
addResult(results[i]);
}
}
private synchronized void addResult(CharSequence result)
{
if (!searchResults.contains(result.toString()))
searchResults.add(result.toString());
else
Toast.makeText(getApplicationContext(), "Result " + result.toString() + " was already on the list!", Toast.LENGTH_SHORT).show();
}
Все это потокобезопасно, а это означает, что позволит вам «изменение» GUI от других, чем основной поток нитей, отправив сообщение в основной поток, что Пользовательский интерфейс нуждается в обновлении. Как вы можете видеть, refreshThread обновляет коллекцию поиска (убедитесь, что метод синхронизирован), а затем уведомляет об этом основной поток (UI) для обновления списка.
Вы, вероятно, найти это полезным слишком
searchList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
listIndex = arg2;
selectedItem = (String) searchList.getItemAtPosition(listIndex);
Toast.makeText(getApplicationContext(), "Result[" + listIndex + "] " + selectedItem + " selected!", Toast.LENGTH_SHORT).show();
}
});
Там может быть несколько свободных концов, такие, как вам необходимо инициализировать ListIndex и SelectedItem или просто выбросить ет, но в целом это сделал трюк для меня очень похожая ситуация (у меня есть фоновый поток, заполняющий список по времени с новыми записями)
Надеется, что это помогает :)
Вам нужно будет выполнить поиск в отдельной ветке, скорее всего, если вы не хотите, чтобы поиск блокировал выполнение вашего основного приложения. Затем попросите его периодически обновлять контейнер новыми объектами TextView. Таким образом, у вас может быть линейный макет, пустой и периодически вызывающий поток поиска, чтобы увидеть, какие результаты он имеет, и добавить их в линейный макет. – DeliveryNinja
Ваш вопрос до сих пор остается без ответа? – winklerrr