我有ArrayAdapter
从AsyncTask.
收集信息AsyncTask
由on滚动侦听器触发。当用户滚动到内容的底部时,AsyncTask
被触发并加载更多内容。问题是我已经实现了一个重置按钮。这样做会清除ArrayAdapter
并将通过JSON发送的令牌重置为收集信息的php脚本。重置按钮根本不起作用。当我调用clear()
时,它有时会清除列表,然后添加新数据,但onScrollListener
不起作用,或者它不会清除列表,只是将新数据添加到列表顶部。这是我的代码,所有这些代码都在同一个活动中。
全局类别用于PHP脚本的令牌
class CommentInfo {
public CommentInfo() {}
private String commentID;
private int gatheredComments;
private int totalComments;
public String getCommentID(){
return commentID;
}
public void setCommentID(String c){
commentID = c;
}
public int getGatheredComments(){
return gatheredComments;
}
public void setGatheredComments(int forNumber){
gatheredComments = forNumber;
}
}//end commentInfor class
final CommentInfo info = new CommentInfo();
info.setCommentID("0");
此类包含全局变量。 CommentID设置为0.这将通过Json发送到php脚本。在收集一组注释后,它会将CommentID重置为收集的最后一条注释的ID。单击“重置”按钮时,它会将“注释ID”重置为0,就像“活动刚刚开始”一样。
ASYNCTASK收集评论并使用全球变量
class loadComments extends AsyncTask<JSONObject, String, JSONObject> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progDailog.getWindow().setGravity(Gravity.BOTTOM);
progDailog.setIndeterminate(false);
progDailog.setCancelable(false);
progDailog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
progDailog.show();
progDailog.setContentView(R.layout.progress_circle);
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
protected JSONObject doInBackground(JSONObject... params) {
JSONObject json2 = CollectComments.collectComments(usernameforcomments, info.getCommentID());
return json2;
}
@Override
protected void onPostExecute(JSONObject json2) {
progDailog.dismiss();
try {
if (json2.getString(KEY_SUCCESS) != null) {
registerErrorMsg.setText("");
String res2 = json2.getString(KEY_SUCCESS);
if(Integer.parseInt(res2) == 1){
JSONArray commentArray = json2.getJSONArray(KEY_COMMENT);
String comments[] = new String[commentArray.length()];
for ( int i=0; i<commentArray.length(); i++ ) {
comments[i] = commentArray.getString(i);
}
JSONArray contentsArray = json2.getJSONArray(KEY_CONTENT);
String contents[] = new String[contentArray.length()];
for ( int i=0; i<contentArray.length(); i++ ) {
contents[i] = contentArray.getString(i);
}
JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME);
String usernames[] = new String[usernameArray.length()];
for ( int i=0; i<usernameArray.length(); i++ ) {
usernames[i] = usernameArray.getString(i);
}
final List <Item> tempList2 = new ArrayList <Item>();
String tempForNumber = json2.getString(KEY_COMMENTS_GATHERED);
int forNumber = Integer.parseInt(tempForNumber);
for (int x = 0; x < forNumber;x++){
tempList2.add (new Item (usernames [x], contents[x], comments[x]));
}
customAdapter.addAll(tempList2);
String commentID = json2.getString(KEY_COMMENT_ID);
info.setCommentID(commentID);
info.setGatheredComments(forNumber);
if (info.getTotalComments() >= Integer.parseInt(json2.getString(KEY_NUMBER_OF_COMMENTS))){
int tempNum = Integer.parseInt(json2.getString(KEY_NUMBER_OF_COMMENTS));
info.setTotalComments(tempNum);
}
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
e.printStackTrace();
}
}//end if key is == 1
else{
// Error in registration
registerErrorMsg.setText(json2.getString(KEY_ERROR_MSG));
}//end else
}//end if
} //end try
catch (JSONException e) {
e.printStackTrace();
}//end catch
}
}
Asynctask
收集多个项目,并将它们放入ArrayAdapter.
这个ArrayAdapter
是我尝试清除的内容,但它永远不会正确。
这是激活ASYNCTASK的滚动侦察员
class EndlessScrollListener implements OnScrollListener {
private int visibleThreshold = 5;
private boolean loading = true;
public EndlessScrollListener() {
}
public EndlessScrollListener(int visibleThreshold) {
this.visibleThreshold = visibleThreshold;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (firstVisibleItem + visibleItemCount) == totalItemCount) {
new loadComments().execute();
loading = true;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
}
我认为问题是因为这堂课的某些事情而发生的。我不确定我在那里相信它。也许是因为下面的变量没有重置或其他什么。
int firstVisibleItem,int visibleItemCount,int totalItemCount
这就是我如何重置ARRAYADAPTER
refresh = (ImageView) findViewById(R.id.refresh);
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(customAdapter!= null)
{
customAdapter.clear();
info.setCommentID("0");
info.setGatheredComments(0);
yourListView.smoothScrollToPosition(0);
new loadComments().execute();
}
}
});
自定义适配器是我的适配器的名称,youListView是我的ListView.
的名称请有人帮助解释适配器无法清除的原因以及OnScrollListener
是否停止工作。< / p>
答案 0 :(得分:5)
致电Adapter.clear()
后,您需要致电Adapter.notifyDataSetChanged()
基本上,每当支持适配器的数据发生变化时,您都需要致电Adapter.notifyDataSetChanged()
以反映ListView
上的更改。
答案 1 :(得分:1)
如果您之前使用过滤器,则需要在致电Adapter.getFilter().filter("");
之前致电Adapter.notifyDataSetChanged();
答案 2 :(得分:0)
刚遇到类似的问题。它似乎在List.clear()
之后和ListAdapter.notifyDataSetChanged();
解决问题后重新实例化并重新附加Scroll Listener。
也许监听器在List.clear()
之后被废弃了?
答案 3 :(得分:0)
有时这不起作用。您还可以从视图中删除所有项目。然后重新填充。
query="INSERT INTO import(customer,package) VALUES(%s, %s)"
答案 4 :(得分:0)
在调用asynctask时尝试删除listview的OnScrollListener,并在asynctask完成其工作时将其设置回来。