Moin zusammen!
Mir ist vorhin aufgefallen, dass ich vor einem kleinem "Randproblem" stehe.
Ich versuche mal, das Problem zu beschreiben.
Ich habe eine FragmentActivity mit 3 Views.
In der ersten View befindet sich eine ListView mit einem Custom ArrayAdapter in der Text ausgegeben wird. In der zweiten befindet sich auch eine ListView in der Text und ein Bild ausgegeben wird mit einem eigenen Custom ArrayAdapter und in der dritten auch eine ListView mit dem CustomArrayAdapter aus der ersten View, nur mit anderen Inhalten.
Solange ich die View in der Reihenfolge stehen lasse, gibt es soweit keine Probleme (Außer dass sich Anfangs die Listitems immer verdoppelt haben, wenn ich zwischen der ersten und der dritten View geswipet bin, konnte das aber mittels if(adapter == null) beheben).
Möchte ich nun aber, dass die ersten beiden View die reinen TextListView beinhalten die den selben ArrayAdapter verwenden und in der dritten dann die Anfangs zweite View, so dauert das switchen von der ersten auf die zweite View extrem lange, zumindestens was das scrollen in der zweiten angeht. Von der zweiten View zur ersten geht ganz normal. Ich habe auch schon einen eigenen ArrayAdapter (also einen dritten) erstellt, aber auch das hilft nix.
Wie gesagt, es ist etwas schwierig zu erklären.
Die beiden ListViews mit reinem Text sind so aufgebaut:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.news_list, container, false);
try {
setAdapter(this.newsListString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return view;
}
Alles anzeigen
private void setAdapter(String items) throws JSONException{
rssItems = result(items);
if(adapter == null){
adapter = new NewsListArrayAdapter(getActivity(), R.layout.news_list_item, rssItems);
}
listView = (ListView) view.findViewById(R.id.mylist);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
ArrayList<String> iArr = new ArrayList<String>();
iArr.add(rssItems[arg2].title);
iArr.add(rssItems[arg2].content);
iArr.add(rssItems[arg2].date);
iArr.add(rssItems[arg2].imgUrl);
iArr.add(rssItems[arg2].link);
iArr.add(String.valueOf(arg2));
Intent i = new Intent(getActivity().getApplicationContext(), DetailFragmentActivity.class);
i.putStringArrayListExtra("item", iArr);
startActivity(i);
}
});
}
Alles anzeigen
public NewsListRSSItems[] result(String result) throws JSONException {
JSONObject jObject = new JSONObject(result);
JSONArray jArray = jObject.getJSONArray("news");
for (int i = 0; i < jArray.length(); i++) {
JSONObject oneObject = jArray.getJSONObject(i);
// Pulling items from the array
String date = oneObject.getString("pubDate");
String title = oneObject.getString("title");
String content = oneObject.getString("subtitle");
String imgUrl = oneObject.getString("imageUrl");
String link = oneObject.getString("url");
rssContent = new ArrayList<String>();
rssContent.add(date);
rssContent.add(title);
rssContent.add(content+"...");
if(imgUrl != null && imgUrl != "" && imgUrl.length() > 4){
rssContent.add(imgUrl);
}
else{
rssContent.add("0");
}
rssContent.add(link);
rssList.setContent(rssContent);
}
return createList();
}
Alles anzeigen
private NewsListRSSItems[] createList() {
rssListContent = rssList.getContent();
NewsListRSSItems rssItems[] = new NewsListRSSItems[rssListContent.size()];
for (int i = 0; i < rssListContent.size(); i++) {
rssItems[i] = new NewsListRSSItems(rssListContent.get(i));
}
return rssItems;
}
Und der ArrayAdapter so:
private Activity context;
private int layoutResourceId;
private NewsListRSSItems newsListData[] = null;
public NewsListArrayAdapter(Activity context, int layoutResourceId, NewsListRSSItems[] newListData) {
super(context, layoutResourceId, newListData);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.newsListData = newListData;
}
public void setList(NewsListRSSItems[] items){
this.newsListData = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if((position % 5) == 0){
if (convertView instanceof AdView) {
// Don’t instantiate new AdView, reuse old one
return convertView;
}
{
// Create a new AdView
AdView adView = new AdView(this.context, AdSize.BANNER, AD_ID);
// Convert the default layout parameters so that they play nice with
// ListView.
float density = context.getResources().getDisplayMetrics().density;
int height = Math.round(AdSize.BANNER.getHeight() * density);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.FILL_PARENT,
height);
adView.setLayoutParams(params);
adView.loadAd(new AdRequest());
return adView;
}
}
else{
NewsItemsHolder newsItemsHolder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
newsItemsHolder = new NewsItemsHolder();
newsItemsHolder.date = (TextView)row.findViewById(R.id.date);
newsItemsHolder.title = (TextView)row.findViewById(R.id.title);
newsItemsHolder.content = (TextView)row.findViewById(R.id.content);
row.setTag(newsItemsHolder);
}
else
{
newsItemsHolder = (NewsItemsHolder)row.getTag();
}
NewsListRSSItems xmlItems = newsListData[position];
newsItemsHolder.date.setText(xmlItems.date);
newsItemsHolder.title.setText(xmlItems.title);
newsItemsHolder.content.setText(xmlItems.content);
return row;
}
}
static class NewsItemsHolder
{
TextView date;
TextView title;
TextView content;
}
}
Alles anzeigen
Es ist ja so, dass die erste View erst dann gecancelt bzw. neu aufgesetzt wird, wenn ich die dritte View aufrufe oder verlasse.
Befinden sich die beiden Views in der ersten und der dritten View, so geht es ohne Probleme. Wobei ich mich Frage, wieso die ListView mit anderem Inhalt ohne Probleme ausgegeben wird, da sie sich ja vom Prinzip her nicht von den anderen beiden unterscheidet.
Ich hoffe, es war halbwegs verständlich. Wie gesagt, wenn ich die "gleichen" ListViews trenne also in View 1 und 3 dann geht es. Aber ich hätte sie schon gerne nebeneinander...
Kann mir da jemand helfen?
Grüße