Android 使用异步任务阻塞UI填充listview并长时间加载
我的问题是: 我有一个片段,其中一个文本视图用于搜索查询,一个按钮用于启动搜索,一个列表视图用于显示结果。 我还使用2个自定义适配器,因为我有2种搜索模式。 当我按下Search按钮时,asynctask应该开始工作并填充listviewAndroid 使用异步任务阻塞UI填充listview并长时间加载,android,listview,android-asynctask,adapter,Android,Listview,Android Asynctask,Adapter,我的问题是: 我有一个片段,其中一个文本视图用于搜索查询,一个按钮用于启动搜索,一个列表视图用于显示结果。 我还使用2个自定义适配器,因为我有2种搜索模式。 当我按下Search按钮时,asynctask应该开始工作并填充listview 问题:AsyncTask冻结了主线程:O 问题:填充的listview中的滚动速度非常慢 我想这是适配器的问题……知道吗 片段类: public class GesetzeFragment extends SherlockFragment { private
public class GesetzeFragment extends SherlockFragment {
private GesetzeFragment local;
EditText etSuchText;
ImageButton ibSuchen;
ListView lvResults;
ToggleButton tbModus;
private boolean paragraphenModus = false;
ArrayList<Gesetz> gesetzeItems = null;
ArrayList<Paragraph> paragraphItems = null;
GesetzeAdapter gesetzeAdapter = null;
ParagraphenAdapter paragraphAdapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.local = this;
View v = inflater.inflate(R.layout.fragment_gesetze, container, false);
tbModus = (ToggleButton) v.findViewById(R.id.toggleButton_modus);
tbModus.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton btn, boolean checked) {
paragraphenModus = checked;
}
});
etSuchText = (EditText) v.findViewById(R.id.editText_search_query);
ibSuchen = (ImageButton) v.findViewById(R.id.imageButton_search);
ibSuchen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onSearchAction(v);
}
});
// Zeige zuerst 50 Gesetze
lvResults = (ListView) v.findViewById(R.id.listView_search_results);
lvResults.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO: Paragraphenansicht öffnen
Gesetz gesetz = (Gesetz) parent.getItemAtPosition(position);
}
});
gesetzeItems = new ArrayList<Gesetz>();
paragraphItems = new ArrayList<Paragraph>();
paragraphAdapter = new ParagraphenAdapter(local.getActivity(),
R.layout.paragraph_list_item, paragraphItems);
gesetzeAdapter = new GesetzeAdapter(local.getActivity(),
R.layout.gesetz_list_item, gesetzeItems);
return v;
}
private void onSearchAction(View v) {
lvResults.setAdapter(paragraphAdapter);
LoadParagraphenTask task = new LoadParagraphenTask();
task.execute(etSuchText.getText().toString(), 10);
}
private class LoadParagraphenTask extends
AsyncTask<Object, Object, ArrayList<Paragraph>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Paragraph> doInBackground(Object... params) {
paragraphItems.clear();
paragraphItems.addAll(Global.mGesetze.getParagraphen(
(String) params[0], (Integer) params[1]));
return paragraphItems;
}
@Override
protected void onPostExecute(ArrayList<Paragraph> results) {
paragraphAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
private class LoadGesetzeTask extends
AsyncTask<Object, Object, ArrayList<Gesetz>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Gesetz> doInBackground(Object... params) {
gesetzeItems.clear();
gesetzeItems.addAll(Global.mGesetze.getGesetze((String) params[0],
(Integer) params[1]));
return gesetzeItems;
}
@Override
protected void onPostExecute(ArrayList<Gesetz> results) {
gesetzeAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
public static GesetzeFragment newInstance(int info) {
GesetzeFragment f = new GesetzeFragment();
Bundle args = new Bundle();
args.putInt("Info", info);
f.setArguments(args);
return f;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<ToggleButton
android:id="@+id/toggleButton_modus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOff="Gesetze"
android:textOn="Paragraphen" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent" >
<EditText
android:id="@+id/editText_search_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:ems="10"
android:imeOptions="actionDone"
android:inputType="text"
android:singleLine="true" >
<requestFocus />
</EditText>
<ImageButton
android:id="@+id/imageButton_search"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:contentDescription="@+id/imageButton_search"
android:scaleType="center"
android:src="@drawable/ic_action_search_dark" />
</LinearLayout>
<ListView
android:id="@+id/listView_search_results"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clickable="true" >
</ListView>
public class ParagraphenAdapter extends ArrayAdapter<Paragraph>{
Context mContext;
int layoutResourceId;
ArrayList<Paragraph> items = null;
public ParagraphenAdapter(Context context, int textViewResourceId, ArrayList<Paragraph> objects) {
super(context, textViewResourceId, objects);
this.mContext = context;
this.layoutResourceId = textViewResourceId;
this.items = objects;
}
public ArrayList<Paragraph> getItems() {
return items;
}
public void setItems(ArrayList<Paragraph> items) {
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewsHolder mHolder = null;
Paragraph item = items.get(position);
if (convertView == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.paragraph_list_item, parent, false);
mHolder = new ViewsHolder();
mHolder.tvGesetzTitelShort = (TextView) convertView.findViewById(R.id.textView_gesetz_titel);
mHolder.tvParagraphTitle = (TextView) convertView.findViewById(R.id.textView_paragraph_titel);
mHolder.tvTextPreview = (TextView) convertView.findViewById(R.id.textView_preview_text);
mHolder.btnFavorite = (ImageButton) convertView.findViewById(R.id.imageButton_favorite);
convertView.setTag(mHolder);
} else {
mHolder = (ViewsHolder) convertView.getTag();
}
mHolder.tvGesetzTitelShort.setText(item.getGesetz().getNameShort());
mHolder.tvParagraphTitle.setText(item.getParagraph());
Spanned spannedContent = Html.fromHtml(item.getText());
mHolder.tvTextPreview.setText(spannedContent, BufferType.SPANNABLE);
return convertView;
}
static class ViewsHolder {
TextView tvGesetzTitelShort;
TextView tvParagraphTitle;
TextView tvTextPreview;
ImageButton btnFavorite;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D8D8D8" >
<ImageButton
android:id="@+id/imageButton_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:focusable="false"
android:src="@android:drawable/btn_star_big_off" />
<TextView
android:id="@+id/textView_gesetz_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerHorizontal="false"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/imageButton_favorite"
android:background="@android:color/transparent"
android:padding="5dp"
android:text="AO"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffF2F2F2" >
<TextView
android:id="@+id/textView_paragraph_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@android:color/transparent"
android:maxLines="1"
android:padding="5dp"
android:text="§ 1"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
<TextView
android:id="@+id/textView_preview_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:maxLines="3"
android:padding="5dp"
android:text="Bla bla Bla bla Bla bla Bla bla Bla bBla bla Bla bla Bla bla Bla bla Bla bla la Bla bla Bla bla Bla bla Bla bla " />
public类GesetzeFragment扩展了SherlockFragment{
私人GesetzeFragment本地;
编辑文本等;
图像按钮ibSuchen;
列表查看结果;
切换按钮tbModus;
私有布尔段落modus=false;
ArrayList gesetzeItems=null;
ArrayList paragraphItems=null;
GesetzeAdapter GesetzeAdapter=null;
paragraphEnableAdapter paragraphAdapter=null;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
this.local=这个;
视图v=充气机。充气(R.layout.fragment_gesetze,容器,假);
tbModus=(ToggleButton)v.findViewById(R.id.ToggleButton_modus);
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮btn,布尔值已选中){
段落模式=已检查;
}
});
etSuchText=(EditText)v.findViewById(R.id.EditText\u search\u query);
ibSuchen=(ImageButton)v.findViewById(R.id.ImageButton\u search);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
研究(五);
}
});
//Zeige zuerst 50 Gesetze
lvResults=(ListView)v.findViewById(R.id.ListView\u搜索结果);
lvResults.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//待办事项:段落
Gesetz Gesetz=(Gesetz)parent.getItemAtPosition(position);
}
});
gesetzeItems=newarraylist();
paragraphItems=新的ArrayList();
paragraphAdapter=新建ParagraphEnableAdapter(local.getActivity(),
R.布局。段落(列表项、段落项);
gesetzeAdapter=新的gesetzeAdapter(local.getActivity(),
R.layout.gesetz_列表_项,gesetzeItems);
返回v;
}
搜索上的私有无效(视图v){
lvResults.setAdapter(段落适配器);
LoadParagraphenTask任务=新建LoadParagraphenTask();
执行(etSuchText.getText().toString(),10);
}
私有类LoadParagraphenTask扩展
异步任务{
private final ProgressDialog dialog=新建ProgressDialog(
local.getActivity());
@凌驾
受保护的void onPreExecute(){
设置消息(“Suche…”);
dialog.show();
super.onPreExecute();
}
@凌驾
受保护的ArrayList doInBackground(对象…参数){
段落项。清除();
paragraphItems.addAll(Global.mGesetze.getParagraphen(
(字符串)参数[0],(整数)参数[1]);
返回段落项目;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
paragraphAdapter.notifyDataSetChanged();
dialog.dismise();
super.onPostExecute(结果);
}
}
私有类LoadGesetzeTask扩展
异步任务{
private final ProgressDialog dialog=新建ProgressDialog(
local.getActivity());
@凌驾
受保护的void onPreExecute(){
设置消息(“Suche…”);
dialog.show();
super.onPreExecute();
}
@凌驾
受保护的ArrayList doInBackground(对象…参数){
gesetzeItems.clear();
gesetzeItems.addAll(Global.mGesetze.getGesetze((字符串)参数[0],
(整数)参数[1]);
返回gesetzeItems;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
gesetzeAdapter.notifyDataSetChanged();
dialog.dismise();
super.onPostExecute(结果);
}
}
公共静态GesetzeFragment newInstance(int info){
GesetzeFragment f=新的GesetzeFragment();
Bundle args=新Bundle();
参数putInt(“信息”,信息);
f、 设置参数(args);
返回f;
}
}
Xml文件:
public class GesetzeFragment extends SherlockFragment {
private GesetzeFragment local;
EditText etSuchText;
ImageButton ibSuchen;
ListView lvResults;
ToggleButton tbModus;
private boolean paragraphenModus = false;
ArrayList<Gesetz> gesetzeItems = null;
ArrayList<Paragraph> paragraphItems = null;
GesetzeAdapter gesetzeAdapter = null;
ParagraphenAdapter paragraphAdapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.local = this;
View v = inflater.inflate(R.layout.fragment_gesetze, container, false);
tbModus = (ToggleButton) v.findViewById(R.id.toggleButton_modus);
tbModus.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton btn, boolean checked) {
paragraphenModus = checked;
}
});
etSuchText = (EditText) v.findViewById(R.id.editText_search_query);
ibSuchen = (ImageButton) v.findViewById(R.id.imageButton_search);
ibSuchen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onSearchAction(v);
}
});
// Zeige zuerst 50 Gesetze
lvResults = (ListView) v.findViewById(R.id.listView_search_results);
lvResults.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO: Paragraphenansicht öffnen
Gesetz gesetz = (Gesetz) parent.getItemAtPosition(position);
}
});
gesetzeItems = new ArrayList<Gesetz>();
paragraphItems = new ArrayList<Paragraph>();
paragraphAdapter = new ParagraphenAdapter(local.getActivity(),
R.layout.paragraph_list_item, paragraphItems);
gesetzeAdapter = new GesetzeAdapter(local.getActivity(),
R.layout.gesetz_list_item, gesetzeItems);
return v;
}
private void onSearchAction(View v) {
lvResults.setAdapter(paragraphAdapter);
LoadParagraphenTask task = new LoadParagraphenTask();
task.execute(etSuchText.getText().toString(), 10);
}
private class LoadParagraphenTask extends
AsyncTask<Object, Object, ArrayList<Paragraph>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Paragraph> doInBackground(Object... params) {
paragraphItems.clear();
paragraphItems.addAll(Global.mGesetze.getParagraphen(
(String) params[0], (Integer) params[1]));
return paragraphItems;
}
@Override
protected void onPostExecute(ArrayList<Paragraph> results) {
paragraphAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
private class LoadGesetzeTask extends
AsyncTask<Object, Object, ArrayList<Gesetz>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Gesetz> doInBackground(Object... params) {
gesetzeItems.clear();
gesetzeItems.addAll(Global.mGesetze.getGesetze((String) params[0],
(Integer) params[1]));
return gesetzeItems;
}
@Override
protected void onPostExecute(ArrayList<Gesetz> results) {
gesetzeAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
public static GesetzeFragment newInstance(int info) {
GesetzeFragment f = new GesetzeFragment();
Bundle args = new Bundle();
args.putInt("Info", info);
f.setArguments(args);
return f;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<ToggleButton
android:id="@+id/toggleButton_modus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOff="Gesetze"
android:textOn="Paragraphen" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent" >
<EditText
android:id="@+id/editText_search_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:ems="10"
android:imeOptions="actionDone"
android:inputType="text"
android:singleLine="true" >
<requestFocus />
</EditText>
<ImageButton
android:id="@+id/imageButton_search"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:contentDescription="@+id/imageButton_search"
android:scaleType="center"
android:src="@drawable/ic_action_search_dark" />
</LinearLayout>
<ListView
android:id="@+id/listView_search_results"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clickable="true" >
</ListView>
public class ParagraphenAdapter extends ArrayAdapter<Paragraph>{
Context mContext;
int layoutResourceId;
ArrayList<Paragraph> items = null;
public ParagraphenAdapter(Context context, int textViewResourceId, ArrayList<Paragraph> objects) {
super(context, textViewResourceId, objects);
this.mContext = context;
this.layoutResourceId = textViewResourceId;
this.items = objects;
}
public ArrayList<Paragraph> getItems() {
return items;
}
public void setItems(ArrayList<Paragraph> items) {
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewsHolder mHolder = null;
Paragraph item = items.get(position);
if (convertView == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.paragraph_list_item, parent, false);
mHolder = new ViewsHolder();
mHolder.tvGesetzTitelShort = (TextView) convertView.findViewById(R.id.textView_gesetz_titel);
mHolder.tvParagraphTitle = (TextView) convertView.findViewById(R.id.textView_paragraph_titel);
mHolder.tvTextPreview = (TextView) convertView.findViewById(R.id.textView_preview_text);
mHolder.btnFavorite = (ImageButton) convertView.findViewById(R.id.imageButton_favorite);
convertView.setTag(mHolder);
} else {
mHolder = (ViewsHolder) convertView.getTag();
}
mHolder.tvGesetzTitelShort.setText(item.getGesetz().getNameShort());
mHolder.tvParagraphTitle.setText(item.getParagraph());
Spanned spannedContent = Html.fromHtml(item.getText());
mHolder.tvTextPreview.setText(spannedContent, BufferType.SPANNABLE);
return convertView;
}
static class ViewsHolder {
TextView tvGesetzTitelShort;
TextView tvParagraphTitle;
TextView tvTextPreview;
ImageButton btnFavorite;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D8D8D8" >
<ImageButton
android:id="@+id/imageButton_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:focusable="false"
android:src="@android:drawable/btn_star_big_off" />
<TextView
android:id="@+id/textView_gesetz_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerHorizontal="false"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/imageButton_favorite"
android:background="@android:color/transparent"
android:padding="5dp"
android:text="AO"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffF2F2F2" >
<TextView
android:id="@+id/textView_paragraph_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@android:color/transparent"
android:maxLines="1"
android:padding="5dp"
android:text="§ 1"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
<TextView
android:id="@+id/textView_preview_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:maxLines="3"
android:padding="5dp"
android:text="Bla bla Bla bla Bla bla Bla bla Bla bBla bla Bla bla Bla bla Bla bla Bla bla la Bla bla Bla bla Bla bla Bla bla " />
两个适配器之一:
public class GesetzeFragment extends SherlockFragment {
private GesetzeFragment local;
EditText etSuchText;
ImageButton ibSuchen;
ListView lvResults;
ToggleButton tbModus;
private boolean paragraphenModus = false;
ArrayList<Gesetz> gesetzeItems = null;
ArrayList<Paragraph> paragraphItems = null;
GesetzeAdapter gesetzeAdapter = null;
ParagraphenAdapter paragraphAdapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.local = this;
View v = inflater.inflate(R.layout.fragment_gesetze, container, false);
tbModus = (ToggleButton) v.findViewById(R.id.toggleButton_modus);
tbModus.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton btn, boolean checked) {
paragraphenModus = checked;
}
});
etSuchText = (EditText) v.findViewById(R.id.editText_search_query);
ibSuchen = (ImageButton) v.findViewById(R.id.imageButton_search);
ibSuchen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onSearchAction(v);
}
});
// Zeige zuerst 50 Gesetze
lvResults = (ListView) v.findViewById(R.id.listView_search_results);
lvResults.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO: Paragraphenansicht öffnen
Gesetz gesetz = (Gesetz) parent.getItemAtPosition(position);
}
});
gesetzeItems = new ArrayList<Gesetz>();
paragraphItems = new ArrayList<Paragraph>();
paragraphAdapter = new ParagraphenAdapter(local.getActivity(),
R.layout.paragraph_list_item, paragraphItems);
gesetzeAdapter = new GesetzeAdapter(local.getActivity(),
R.layout.gesetz_list_item, gesetzeItems);
return v;
}
private void onSearchAction(View v) {
lvResults.setAdapter(paragraphAdapter);
LoadParagraphenTask task = new LoadParagraphenTask();
task.execute(etSuchText.getText().toString(), 10);
}
private class LoadParagraphenTask extends
AsyncTask<Object, Object, ArrayList<Paragraph>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Paragraph> doInBackground(Object... params) {
paragraphItems.clear();
paragraphItems.addAll(Global.mGesetze.getParagraphen(
(String) params[0], (Integer) params[1]));
return paragraphItems;
}
@Override
protected void onPostExecute(ArrayList<Paragraph> results) {
paragraphAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
private class LoadGesetzeTask extends
AsyncTask<Object, Object, ArrayList<Gesetz>> {
private final ProgressDialog dialog = new ProgressDialog(
local.getActivity());
@Override
protected void onPreExecute() {
dialog.setMessage("Suche...");
dialog.show();
super.onPreExecute();
}
@Override
protected ArrayList<Gesetz> doInBackground(Object... params) {
gesetzeItems.clear();
gesetzeItems.addAll(Global.mGesetze.getGesetze((String) params[0],
(Integer) params[1]));
return gesetzeItems;
}
@Override
protected void onPostExecute(ArrayList<Gesetz> results) {
gesetzeAdapter.notifyDataSetChanged();
dialog.dismiss();
super.onPostExecute(results);
}
}
public static GesetzeFragment newInstance(int info) {
GesetzeFragment f = new GesetzeFragment();
Bundle args = new Bundle();
args.putInt("Info", info);
f.setArguments(args);
return f;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical" >
<ToggleButton
android:id="@+id/toggleButton_modus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOff="Gesetze"
android:textOn="Paragraphen" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent" >
<EditText
android:id="@+id/editText_search_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:ems="10"
android:imeOptions="actionDone"
android:inputType="text"
android:singleLine="true" >
<requestFocus />
</EditText>
<ImageButton
android:id="@+id/imageButton_search"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:contentDescription="@+id/imageButton_search"
android:scaleType="center"
android:src="@drawable/ic_action_search_dark" />
</LinearLayout>
<ListView
android:id="@+id/listView_search_results"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clickable="true" >
</ListView>
public class ParagraphenAdapter extends ArrayAdapter<Paragraph>{
Context mContext;
int layoutResourceId;
ArrayList<Paragraph> items = null;
public ParagraphenAdapter(Context context, int textViewResourceId, ArrayList<Paragraph> objects) {
super(context, textViewResourceId, objects);
this.mContext = context;
this.layoutResourceId = textViewResourceId;
this.items = objects;
}
public ArrayList<Paragraph> getItems() {
return items;
}
public void setItems(ArrayList<Paragraph> items) {
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewsHolder mHolder = null;
Paragraph item = items.get(position);
if (convertView == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.paragraph_list_item, parent, false);
mHolder = new ViewsHolder();
mHolder.tvGesetzTitelShort = (TextView) convertView.findViewById(R.id.textView_gesetz_titel);
mHolder.tvParagraphTitle = (TextView) convertView.findViewById(R.id.textView_paragraph_titel);
mHolder.tvTextPreview = (TextView) convertView.findViewById(R.id.textView_preview_text);
mHolder.btnFavorite = (ImageButton) convertView.findViewById(R.id.imageButton_favorite);
convertView.setTag(mHolder);
} else {
mHolder = (ViewsHolder) convertView.getTag();
}
mHolder.tvGesetzTitelShort.setText(item.getGesetz().getNameShort());
mHolder.tvParagraphTitle.setText(item.getParagraph());
Spanned spannedContent = Html.fromHtml(item.getText());
mHolder.tvTextPreview.setText(spannedContent, BufferType.SPANNABLE);
return convertView;
}
static class ViewsHolder {
TextView tvGesetzTitelShort;
TextView tvParagraphTitle;
TextView tvTextPreview;
ImageButton btnFavorite;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D8D8D8" >
<ImageButton
android:id="@+id/imageButton_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:focusable="false"
android:src="@android:drawable/btn_star_big_off" />
<TextView
android:id="@+id/textView_gesetz_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerHorizontal="false"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/imageButton_favorite"
android:background="@android:color/transparent"
android:padding="5dp"
android:text="AO"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffF2F2F2" >
<TextView
android:id="@+id/textView_paragraph_titel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@android:color/transparent"
android:maxLines="1"
android:padding="5dp"
android:text="§ 1"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
<TextView
android:id="@+id/textView_preview_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:maxLines="3"
android:padding="5dp"
android:text="Bla bla Bla bla Bla bla Bla bla Bla bBla bla Bla bla Bla bla Bla bla Bla bla la Bla bla Bla bla Bla bla Bla bla " />
公共类段落适配器扩展了ArrayAdapter{
语境;
国际布局资源;
arraylistitems=null;
公共段落适配器(上下文上下文、int textViewResourceId、ArrayList对象){
超级(上下文、textViewResourceId、对象);
this.mContext=上下文;
this.layoutResourceId=textViewResourceId;
此项=对象;
}
公共阵列列表getItems(){
退货项目;
}
公共无效集合项(ArrayList项){
这个项目=项目;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewsHolder mHolder=null;
段落项=项。获取(位置);
如果(convertView==null)//Wird zum ersten Mal gelanden。。。
{
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.段落列表项,父项,false);
mHolder=新的ViewsHolder();
mHolder.tvGesetzTitelShort=(TextView)convertView.findViewById(R.id.TextView\u gesetz\u titel);
mHolder.tvParagraphTitle=(TextView)convertView.findViewById(R.id.TextView\u段落\u titel);
mHolder.tvTextPreview=(TextView)convertView.findViewById(R.id.TextView\u preview\u text);
mHolder.btnFavorite=(ImageButton)convertView.findViewById(R.id.ImageButton\u收藏夹);
convertView.setTag(mHolder);
}埃尔