我正在使用AyncTask从服务器获取数据并将其设置为listview。
要通知列表视图的更改,我正在调用mAdapter.notifyDataSetChanged(); in onPostExecute() method
我正在使用Pull to refresh listview库
我仍然得到IllegalStateException
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int count = Integer.parseInt(index_temp)+6;
System.out.println("Checking "+ listView.getLastVisiblePosition());
System.out.println("----->Checking loadmore:"+ load_more);
System.out.println("----->Checking actual:"+ count);
if (listView.getLastVisiblePosition()+1 == count) {
if(load_more==1){
index_temp = String.valueOf(Integer.parseInt(icount) + Integer.parseInt(index_temp));
new GetList_ontouch().execute(index_temp);
}
}
}
});
GetList_ontouch
private class GetList_ontouch extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar1.setVisibility(0);
}
@Override
protected Void doInBackground(String... params) {
if (NetworkCheck.isNetworkAvailable(getActivity()) == true) {
Log.d("index count for array", params[0]);
if(Integer.parseInt(params[0])==0){
Log.d("index count for array","Reached");
newsList = new ArrayList<HashMap<String, String>>();
}
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(All_link.HOME_DATA_URL + "/"+params[0]+"/"+ icount,
ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
news = jsonObj.getJSONArray(All_link.TAG_NEWS);
String err = jsonObj.getString(All_link.TAG_ERROR);
String more = jsonObj.getString(All_link.TAG_MORE);
Log.e("------>Error",String.valueOf(err));
Log.e("------>More",String.valueOf(more));
if(more.equals("0")){
load_more = 0;
}else{
load_more = 1;
}
// looping through All Contacts
for (int i = 0; i < news.length(); i++) {
JSONObject segments_list = news.getJSONObject(i);
for (int plates_count = 0; plates_count < segments_list
.length(); plates_count++) {
String plates = "";
if (plates_count == 3) {
plates = String.valueOf("banner_image");
JSONObject segments_plates = segments_list
.getJSONObject(plates);
//String flag = "banner_image";
String id = segments_plates
.getString(All_link.TAG_BANNER_ID);
String banner_no = segments_plates
.getString(All_link.TAG_BANNER_NO);
String banner_image;
if(segments_plates.getString(All_link.TAG_BANNER_THUMB_URL)==""){
banner_image = All_link.TAG_NO_IMAGE;
}else{
banner_image = segments_plates.getString(All_link.TAG_BANNER_THUMB_URL);
}
String banner_status = segments_plates
.getString(All_link.TAG_BANNER_STATUS);
// tmp hashmap for single news
HashMap<String, String> news_hashmap = new HashMap<String, String>();
// adding each child node to HashMap key =>
// value
news_hashmap.put(All_link.TAG_BANNER_ID, id);
news_hashmap.put(All_link.TAG_BANNER_NO,
banner_no);
news_hashmap.put(All_link.TAG_BANNER_THUMB_URL,
banner_image);
news_hashmap.put(All_link.TAG_BANNER_STATUS,
banner_status);
/*news_hashmap
.put(All_link.TAG_BANNER_FLAG, flag);*/
// adding contact to contact list
//newsList.add(news_hashmap);
addSeparatorItem();
} else {
plates = String.valueOf(plates_count + 1);
JSONObject segments_plates = segments_list
.getJSONObject(plates);
if(segments_plates.getString(All_link.TAG_NEWS_TYPE).equals("2")){
//type_of_news = segments_plates.getString(All_link.TAG_NEWS_TYPE);
addSeparatorItem_for_live();
}
String id = segments_plates
.getString(All_link.TAG_ID);
String news_title = segments_plates
.getString(All_link.TAG_NEWS_TITLE);
String news_desc = segments_plates
.getString(All_link.TAG_DESC);
String segment = segments_plates
.getString(All_link.TAG_SEGMENT);
String plate = segments_plates
.getString(All_link.TAG_PLATE);
String img ="";
if(segments_plates.getString(All_link.TAG_THUMB_URL).equals("")){
img = All_link.TAG_NO_IMAGE;
}else{
img = segments_plates.getString(All_link.TAG_THUMB_URL);
}
HashMap<String, String> news_hashmap = new HashMap<String, String>();
// adding each child node to HashMap key =>
// value
news_hashmap.put(All_link.TAG_ID, id);
news_hashmap.put(All_link.TAG_NEWS_TITLE, news_title);
news_hashmap.put(All_link.TAG_DESC, news_desc);
news_hashmap.put(All_link.TAG_SEGMENT, segment);
news_hashmap.put(All_link.TAG_PLATE, plate);
news_hashmap.put(All_link.TAG_THUMB_URL, img);
//news_hashmap.put(All_link.TAG_BANNER_FLAG, flag);
// adding contact to contact list
newsList.add(news_hashmap);
int val = 0;
int val2 = 1;
val = (Integer.parseInt(segment)%2)==0 ? val:val2;
if((Integer.parseInt(segment)%2)!=0){
Log.e("--->CHECKING ODD EVEN", String.valueOf(val));
addSeparatorItem();
addSeparatorItem_for_alternate();
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
} else {
Log.e("Network Error", "Internet Connection Error");
error_flag = 1;
Log.e("error", "kareeScroll error_flag = 1");
// error = "Internet Connection Error";
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(error_flag==1){
/*listView.setVisibility(8);
main_error.setText("Internet Connection Error! Please check your network settings and try again");
main_error.setVisibility(0);*/
String jsonStr_temp=sharedPrefs.getString("jsonStr", "");
if (jsonStr_temp=="") {
listView.setVisibility(8);
main_error.setText("Internet Connection Error! Please check your network settings and try again");
main_error.setVisibility(0);
img_error.setVisibility(0);
}
else{
//newsList=null;
new GetList_refresh().execute(index_th,jsonStr_temp);
//newsList = new ArrayList<HashMap<String, String>>();
}
}
else{
listView.setVisibility(0);
main_error.setText("");
main_error.setVisibility(8);
int currentPosition = listView.getFirstVisiblePosition();
mAdapter = new MyCustomAdapter(getActivity(), newsList);
//testing
listView.setAdapter(mAdapter);
//refreshable_listView.setAdapter(mAdapter);
// Setting new scroll position
listView.setSelection(currentPosition);
//mAdapter.notifyDataSetChanged();
}
// Dismiss the progress dialog
progressBar1.setVisibility(8);
}
}
GetList_refresh //在没有网络时调用。这显示从本地变量
获取的数据private class GetList_refresh extends AsyncTask<String, String, Void> {
Dialog dialog = new Dialog(getActivity());
String jsonStr;
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout._wait_dialog);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.show();
}
@Override
protected Void doInBackground(String... params) {
//if (NetworkCheck.isNetworkAvailable(getActivity()) == true) {
//Log.d("index count for array", params[0]);
//if(Integer.parseInt(params[0])==0){
//Log.d("index count for array","Rweached");
//newsList = new ArrayList<HashMap<String, String>>();
//}
jsonStr=params[1];
Log.e("json","karjson "+jsonStr);
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
//jsonStr = sh.makeServiceCall(All_link.HOME_DATA_URL + "/"+params[0]+"/"+ icount,
//ServiceHandler.GET);
editor.putString("jsonStr", jsonStr);
editor.commit();
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
news = jsonObj.getJSONArray(All_link.TAG_NEWS);
err = jsonObj.getString(All_link.TAG_ERROR);
String more = jsonObj.getString(All_link.TAG_MORE);
Log.e("------>Error",String.valueOf(err));
Log.e("------>More",String.valueOf(more));
if(more.equals("0")){
load_more = 0;
}else{
load_more = 1;
}
// looping through All Contacts
for (int i = 0; i < news.length(); i++) {
//karthik
JSONObject segments_list = news.getJSONObject(i);
for (int plates_count = 0; plates_count < segments_list
.length(); plates_count++) {
String plates = "";
if (plates_count == 3) {
plates = String.valueOf("banner_image");
JSONObject segments_plates = segments_list
.getJSONObject(plates);
//String flag = "banner_image";
String id = segments_plates
.getString(All_link.TAG_BANNER_ID);
String banner_no = segments_plates
.getString(All_link.TAG_BANNER_NO);
String banner_image;
if(segments_plates.getString(All_link.TAG_BANNER_THUMB_URL)==""){
banner_image = All_link.TAG_NO_IMAGE;
}else{
banner_image = segments_plates.getString(All_link.TAG_BANNER_THUMB_URL);
}
String banner_status = segments_plates
.getString(All_link.TAG_BANNER_STATUS);
// tmp hashmap for single news
HashMap<String, String> news_hashmap = new HashMap<String, String>();
// adding each child node to HashMap key =>
// value
news_hashmap.put(All_link.TAG_BANNER_ID, id);
news_hashmap.put(All_link.TAG_BANNER_NO,
banner_no);
news_hashmap.put(All_link.TAG_BANNER_THUMB_URL,
banner_image);
news_hashmap.put(All_link.TAG_BANNER_STATUS,
banner_status);
/*news_hashmap
.put(All_link.TAG_BANNER_FLAG, flag);*/
// adding contact to contact list
newsList.add(news_hashmap);
//karthik newsList
//Local_newsList.add(news_hashmap);
addSeparatorItem();
} else {
plates = String.valueOf(plates_count + 1);
JSONObject segments_plates = segments_list
.getJSONObject(plates);
if(segments_plates.getString(All_link.TAG_NEWS_TYPE).equals("2")){
//type_of_news = segments_plates.getString(All_link.TAG_NEWS_TYPE);
addSeparatorItem_for_live();
}
String id = segments_plates.getString(All_link.TAG_ID);
String news_title = segments_plates.getString(All_link.TAG_NEWS_TITLE);
String news_desc = segments_plates.getString(All_link.TAG_DESC);
String segment = segments_plates.getString(All_link.TAG_SEGMENT);
String plate = segments_plates.getString(All_link.TAG_PLATE);
String img ="";
if(segments_plates.getString(All_link.TAG_THUMB_URL).equals("")){
img = All_link.TAG_NO_IMAGE;
}else{
img = segments_plates.getString(All_link.TAG_THUMB_URL);
}
HashMap<String, String> news_hashmap = new HashMap<String, String>();
// adding each child node to HashMap key =>
// value
news_hashmap.put(All_link.TAG_ID, id);
news_hashmap.put(All_link.TAG_NEWS_TITLE, news_title);
news_hashmap.put(All_link.TAG_DESC, news_desc);
news_hashmap.put(All_link.TAG_SEGMENT, segment);
news_hashmap.put(All_link.TAG_PLATE, plate);
news_hashmap.put(All_link.TAG_THUMB_URL, img);
//news_hashmap.put(All_link.TAG_BANNER_FLAG, flag);
// adding contact to contact list
newsList.add(news_hashmap);
//karthik newsList
//Local_newsList.add(news_hashmap);
int val = 0;
int val2 = 1;
val = (Integer.parseInt(segment)%2)==0 ? val:val2;
if((Integer.parseInt(segment)%2)!=0){
Log.e("--->CHECKING ODD EVEN", String.valueOf(val));
addSeparatorItem();
addSeparatorItem_for_alternate();
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
mAdapter.notifyDataSetChanged();
refreshable_listView.invalidate();
refreshable_listView.requestLayout();
refreshable_listView.onRefreshComplete();
super.onPostExecute(result);
// Dismiss the progress dialog
if (dialog.isShowing()){
dialog.dismiss();
}
/*SharedPreferences sharedPrefs = getActivity().getSharedPreferences(All_link.MyPREFERENCES,
Context.MODE_PRIVATE);
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());*/
//For Breaking News Setting
if (sharedPrefs.getInt("prefswtch4", 1) == 1) {
if (All_link.GLOBAL_BREAKING_FLAG == 0) {
new getBreakingNews().execute();
}
}
//For Location Setting
if (sharedPrefs.getInt("prefswtch1", 1) == 1) {
} else {
}
//For Ticker Setting
if (sharedPrefs.getInt("prefswtch2", 1) == 1) {
new getTicker().execute();
} else {
marque.setVisibility(8);
}
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
refreshable_listView.onRefreshComplete();
}
}
OnCreateView ...
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
sharedPrefs = getActivity().getSharedPreferences(All_link.MyPREFERENCES,
Context.MODE_PRIVATE);
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
editor=sharedPrefs.edit();
View rootView = inflater.inflate(R.layout.listview_layout, container,false);
View footer_image=inflater.inflate(R.layout.listview_image_footer, null,false);
//footer_image.setClickable(false);
/* get theme webservice*/
StrictMode.ThreadPolicy policy1 = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy1);
userFunction=new UserFunctions();
//Breaking News Section
slide = AnimationUtils.loadAnimation(getActivity(), R.anim.slidedown);
fadeOut = AnimationUtils.loadAnimation(getActivity(), R.anim.fadeout);
pan_breaking_new = (LinearLayout)rootView.findViewById(R.id.pan_breaking_new);
//pan_breaking_new.setOnClickListener(this);
pan_breaking_new.setVisibility(8);
btn_close= (ImageView) rootView.findViewById(R.id.btn_close);
btn_close.setOnClickListener(this);
img_share= (ImageView) rootView.findViewById(R.id.img_share);
img_share.setOnClickListener(this);
//END Breaking News Section
//Ticker
marque = (ScrollingTextView)rootView.findViewById(R.id.txtTicker);
marque.setVisibility(8);
//END ticker
main_error = (TextView) rootView.findViewById(R.id.main_error);
main_error.setText("Loading...");
img_error = (ImageView) rootView.findViewById(R.id.img_error);
img_error.setOnClickListener(this);
progressBar1 = (ProgressBar) rootView.findViewById(R.id.progressBar1);
progressBar1.setVisibility(8);
//karthik
refreshable_listView = (PullToRefreshListView) rootView.findViewById(R.id.listView);
listView=refreshable_listView.getRefreshableView();
listView.addFooterView(footer_image, null, false);
refreshable_listView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// TODO Auto-generated method stub
listView=refreshable_listView.getRefreshableView();
try {
getTheme();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new GetList().execute(index_th);
}
});
newsList = new ArrayList<HashMap<String, String>>();
mAdapter = new MyCustomAdapter(getActivity(), newsList);
refreshable_listView.setAdapter(mAdapter);
//listView.addHeaderView(pan_breaking_new);
mSeparatorsSet = new TreeSet<Integer>();
mSeparatorsSet_alternate_layout = new TreeSet<Integer>();
mSeparatorsSet_live_layout = new TreeSet<Integer>();
new GetList_with_dialog().execute(index_th); // same as GetList(), but displays dialog
return rootView;
}
MyCursorAdapter
private class MyCustomAdapter extends BaseAdapter {
private Activity activity;
Boolean result;
private final LayoutInflater inflater = null;
public ImageLoader imageLoader;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_SEPARATOR_ALTERNATE = 2;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 3;
private int live_type = 0;
private LayoutInflater mInflater;
public MyCustomAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
mInflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
activity = a;
//newsList=d;
imageLoader = new ImageLoader(activity.getApplicationContext());
}
@Override
public int getItemViewType(int position) {
int separtorValue;
int pos = mSeparatorsSet.contains(position) ? TYPE_SEPARATOR: TYPE_ITEM;
live_type = mSeparatorsSet_live_layout.contains(position) ? TYPE_SEPARATOR: TYPE_ITEM;
if(pos==1){
//Log.e("--->if called- position->", String.valueOf(position));
if(mSeparatorsSet_alternate_layout.contains(position)){
//Log.e("--->if called-->", String.valueOf(position));
separtorValue = 2;
}else{
separtorValue = 1;
}
}else{
separtorValue = 0;
}
return separtorValue;
}
@Override
public int getViewTypeCount() {
Log.e("--->TYPE_MAX_COUNT called-->", String.valueOf(TYPE_MAX_COUNT));
return TYPE_MAX_COUNT;
}
@Override
public int getCount() {
return newsList.size();
}
@Override
public HashMap<String, String> getItem(int position) {
return newsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
NewsViewHolder holder = null;
int type = getItemViewType(position);
Log.e("--->SHISHIR-->", String.valueOf(live_type));
/*System.out.println("getView " + position + " " + convertView
+ " type = " + type);
**/
//Log.e("--->SHISHIR-->", String.valueOf(position) + " -->live"+String.valueOf(mSeparatorsSet_live_layout.first()));
if (convertView == null) {
holder = new NewsViewHolder();
//Log.e("--itempostion", String.valueOf(getItem(type)));
switch (type) {
case TYPE_ITEM:
if (CURRENT_THEME==1) {
convertView = mInflater.inflate(
R.layout.theme_one_row_small, null);
}
else{
convertView = mInflater.inflate(
R.layout.theme_one_row_small_new, null);
}
holder.img_flag = (ImageView) convertView.findViewById(R.id.img_live_flag);
holder.id = (TextView) convertView.findViewById(R.id.fid);
holder.live = (TextView) convertView.findViewById(R.id.live);
holder.flag = (TextView) convertView.findViewById(R.id.flag);
holder.name = (TextView) convertView
.findViewById(R.id.title);
holder.img = (ImageView) convertView
.findViewById(R.id.list_image);
imageLoader
.DisplayImage(
com.rb.library.All_link.IMAGE_URI_BANNER
+ newsList.get(position).get(
All_link.TAG_THUMB_URL),
holder.img);
break;
case TYPE_SEPARATOR_ALTERNATE:
if (CURRENT_THEME==1) {
convertView = mInflater
.inflate(R.layout.theme_one_row_big, null);
}
else{
convertView = mInflater
.inflate(R.layout.theme_one_row_big_new, null);
}
holder.flag = (TextView) convertView.findViewById(R.id.flag);
holder.img_flag = (ImageView) convertView.findViewById(R.id.img_live_flag);
holder.id = (TextView) convertView.findViewById(R.id.fid);
holder.live = (TextView) convertView.findViewById(R.id.live);
holder.name = (TextView) convertView
.findViewById(R.id.title);
holder.img = (ImageView) convertView
.findViewById(R.id.list_image);
break;
case TYPE_SEPARATOR:
convertView = mInflater
.inflate(R.layout.theme_banner, null);
holder.flag = (TextView) convertView.findViewById(R.id.flag);
holder.id = (TextView) convertView.findViewById(R.id.fid);
holder.name = (TextView) convertView
.findViewById(R.id.title);
holder.img = (ImageView) convertView
.findViewById(R.id.list_image);
break;
}
convertView.setTag(holder);
} else {
holder = (NewsViewHolder) convertView.getTag();
}
switch (type) {
case TYPE_ITEM:
if(live_type == 1){
holder.img_flag.setVisibility(0);
holder.live.setText("live");
}else{
holder.live.setText("not_live");
holder.img_flag.setVisibility(8);
}
imageLoader.DisplayImage(com.rb.library.All_link.IMAGE_URI+ newsList.get(position).get(All_link.TAG_THUMB_URL),
holder.img);
holder.id.setText(String.valueOf(newsList.get(position).get(
All_link.TAG_ID)));
holder.flag.setText("normal");
break;
case TYPE_SEPARATOR_ALTERNATE:
if(live_type == 1){
holder.img_flag.setVisibility(0);
holder.live.setText("live");
//Log.e("--itempostion Live", "live");
}else{
holder.live.setText("not_live");
holder.img_flag.setVisibility(8);
}
imageLoader.DisplayImage(com.rb.library.All_link.IMAGE_URI+ newsList.get(position).get(All_link.TAG_THUMB_URL),
holder.img);
holder.id.setText(String.valueOf(newsList.get(position).get(
All_link.TAG_ID)));
holder.flag.setText("normal");
Log.e("karthik", "karthik "+com.rb.library.All_link.IMAGE_URI+ newsList.get(position).get(All_link.TAG_THUMB_URL));
break;
case TYPE_SEPARATOR:
Log.e("--banner Images", com.rb.library.All_link.IMAGE_URI_BANNER
+ newsList.get(position).get(All_link.TAG_BANNER_THUMB_URL));
imageLoader.DisplayImage(com.rb.library.All_link.IMAGE_URI_BANNER
+ newsList.get(position).get(All_link.TAG_BANNER_THUMB_URL),
holder.img);
holder.id.setText(String.valueOf(newsList.get(position).get(
All_link.TAG_BANNER_ID)));
holder.flag.setText(newsList.get(position).get(All_link.TAG_BANNER_THUMB_URL));
break;
}
holder.name.setText(String.valueOf(newsList.get(position).get(All_link.TAG_NEWS_TITLE)));
return convertView;
}
}
答案 0 :(得分:0)
您不应该在doInBackground()中调用任何更新列表的方法。您应该收集doInBackground中的所有内容,将其作为结果返回,然后更新onPostExecute中的列表。 因为onPostExecute和onProgressUpdate是在UI线程中执行的,而doInBackground是在不同的线程中执行的。
答案 1 :(得分:0)
每次调用doInBackground
时都不要重新创建适配器
mAdapter = new MyCustomAdapter(getActivity(), newsList);
listView.setAdapter(mAdapter);
在相关的地方创建一次。
mAdapter = new MyCustomAdapter(getActivity(), new ArrayList<HashMap<String, String>>());
listView.setAdapter(mAdapter);
然后返回List
doInBackground
return newsList;
并像这样更改onPostExecute
,将结果集成到适配器中。 onPostExecute
在UI线程中运行,旨在处理这种操作,例如更新适配器。
@Override
protected void onPostExecute(List<HashMap<String, String>> result)
{
// Assuming here MyCustomAdapter is an ArrayAdapter
mAdapter.clear();
mAdapter.addAll(result);
mAdapter.notifyDataSetChanged();
// [...]
}
AsyncTask看起来像这样:
private class GetList_refresh extends AsyncTask<String, String, List<HashMap<String, String>>>