我有一个填充listView的自定义arrayAdapter。当我第一次加载listActivity时,从AsyncTask加载的信息正确加载而没有任何重复。
在同一个活动中,我使用ActionBar中的搜索字段,但出于某种原因,当我使用相同的arrayAdapter显示结果时,结果总是重复,有时甚至会增加三倍。
我已经对本网站和其他网站上的答案进行了两次和三次检查,但似乎无法提出有效的解决方案。如果你没有完整的解决方案,也许你可能会朝着正确的方向推动我。这是我的arrayAdapter:
public class JobsAdapter extends ArrayAdapter<String> {
public static LayoutInflater inflater = null;
public ArrayList<HashMap<String, String>> jobList;
public String jobId;
public Context context;
public int layoutResourceId;
public static class ViewHolder {
TextView jid;
TextView jid2;
TextView jcn;
TextView jd;
TextView js;
}
public JobsAdapter(Context context, int layoutResourceId){
super(context, layoutResourceId);
this.context = context;
}
public JobsAdapter(Context context, int layoutResourceId, ArrayList<HashMap<String, String>> jobList){
super(context, layoutResourceId);
this.context = context;
this.jobList = jobList;
}
@Override
public int getCount() {
return jobList.size();
}
public Item getItem(Item position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View v = convertView;
if(v == null)
{
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_edit_job_item, parent, false);
holder = new ViewHolder();
holder.jid = (TextView) v.findViewById(R.id.jobid);
holder.jid2 = (TextView) v.findViewById(R.id.jobID);
holder.jcn = (TextView) v.findViewById(R.id.jobClientName);
holder.jd = (TextView) v.findViewById(R.id.jobDescription);
holder.js = (TextView) v.findViewById(R.id.jobStatus);
v.setTag(holder);
}
else
{
holder = (ViewHolder) v.getTag();
}
HashMap<String, String> i = jobList.get(position);
String sjid = i.get("jobID");
String sjid2 = i.get("jobID");
String sjcn = i.get("clientName");
String sjd = i.get("description");
String sjs = i.get("status");
if(holder.jid != null)
{
holder.jid.setText(sjid);
}
if(holder.jid2 != null)
{
holder.jid2.setText(sjid2);
}
if(holder.jcn != null)
{
holder.jcn.setText(sjcn);
}
if(holder.jd != null)
{
holder.jd.setText(sjd);
}
if(holder.js != null)
{
holder.js.setText(sjs);
}
return v;
}
public void updateList(ArrayList<HashMap<String, String>> newJobList) {
jobList.addAll(newJobList);
this.notifyDataSetChanged();
}
public void addAllItems(ArrayList<HashMap<String, String>> newJobList) {
jobList.clear();
jobList.addAll(newJobList);
this.notifyDataSetChanged();
}
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
}
这是我的主要活动:
public class DisplayEditJobs extends ListActivity implements OnScrollListener, OnQueryTextListener {
private static final String TAG_JOB_JOBID = "jobID";
private static final String TAG_JOB_CLIENTID = "clientID";
private static final String TAG_JOB_CLIENT_NAME = "clientName";
private static final String TAG_JOB_TITLE = "clientID";
private static final String TAG_JOB_STATUS = "status";
private static final String TAG_JOB_DATE_CREATED = "date_created";
private static final String TAG_JOB_NOTES = "notes";
private static final String TAG_JOB_DESCRIPTION = "description";
private static final String TAG_SUCCESS = "success";
private static final String TAG_JOBS = "jobs";
Aleph0 adapter = new Aleph0();
private ProgressDialog pDialog;
public String jobID, userPermissions;
public EditText notes, description, createdDate;
public Spinner status, client;
public Button AddJobButton, pickCreatedDateButton;
ArrayList<User> clientList;
ArrayList<String> technicianIDList;
List<String> labels;
ActionBar actionBar;
ListView lv;
int success = 0 ;
int page = 1;
int currentPage = 1;
int threshold = 3;
private SearchView searchView;
private static final String display_jobs_url = "http://com.tradeport.on.ca/view_all_jobs.php";
String query = "";
JSONParser jsonParser = new JSONParser();
JSONArray user_session = null;
int pagedefault = 1;
JSONArray jobs = null;
Button btnLoadMore;
TextView pageid;
int newpageid;
public JobsAdapter myAdapter;
ArrayList<HashMap<String, String>> jobsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_edit_jobs);
ActionBar actionBar = getActionBar();
actionBar.setTitle("Choose a Job to Edit");
actionBar.setDisplayHomeAsUpEnabled(true);
jobsList = new ArrayList<HashMap<String, String>>();
myAdapter = new JobsAdapter(DisplayEditJobs.this, R.layout.list_edit_job_item, jobsList);
getListView().setOnScrollListener(this);
new LoadAllJobs().execute();
lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String jobid = ((TextView) view.findViewById(R.id.jobid)).getText().toString();
Intent in = new Intent(getApplicationContext(),Jobs.class);
in.putExtra(TAG_JOB_JOBID, jobid);
startActivityForResult(in, 100);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100) {
Intent intent = getIntent();
finish();
startActivity(intent);
}
}
class LoadAllJobs extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(DisplayEditJobs.this);
pDialog.setMessage("Loading Jobs. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(String... args) {
SharedPreferences pref = getApplicationContext().getSharedPreferences("USER_SESSION", 0);
String session_username = pref.getString("username", null);
String session_key = pref.getString("key", null);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", "view_all_jobs"));
params.add(new BasicNameValuePair("username", session_username));
params.add(new BasicNameValuePair("key", session_key ));
params.add(new BasicNameValuePair("page", String.valueOf(page)));
JSONObject json = jsonParser.makeHttpRequest(display_jobs_url, "POST", params);
Log.d("All Instruments: ", json.toString());
try {
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
jobs = json.getJSONArray(TAG_JOBS);
for (int i = 0; i < jobs.length(); i++) {
JSONObject c = jobs.getJSONObject(i);
String jobid = c.getString(TAG_JOB_JOBID);
String clientName = c.getString(TAG_JOB_CLIENT_NAME);
String status = c.getString(TAG_JOB_STATUS);
String description = c.getString(TAG_JOB_DESCRIPTION);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_JOB_JOBID, jobid);
map.put(TAG_JOB_CLIENT_NAME, "Client : "+clientName);
map.put(TAG_JOB_STATUS, status);
map.put(TAG_JOB_DESCRIPTION, description);
jobsList.add(map);
}
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();
Context context = getBaseContext();
myAdapter = new JobsAdapter(context, R.layout.list_edit_job_item, jobsList);
lv.setAdapter(myAdapter);
}
}
class updateJobs extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... args) {
jobs = null;
success = 0;
SharedPreferences pref = getApplicationContext().getSharedPreferences("USER_SESSION", 0);
String session_username = pref.getString("username", null);
String session_key = pref.getString("key", null);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", "view_all_jobs"));
params.add(new BasicNameValuePair("username", session_username));
params.add(new BasicNameValuePair("key", session_key ));
params.add(new BasicNameValuePair("page", String.valueOf(page)));
JSONObject json = jsonParser.makeHttpRequest(display_jobs_url, "POST", params);
Log.d("All Instruments: ", json.toString());
try {
if (success == 1) {
jobsList.clear();
jobs = json.getJSONArray(TAG_JOBS);
for (int i = 0; i < jobs.length(); i++) {
JSONObject c = jobs.getJSONObject(i);
String jobid = c.getString(TAG_JOB_JOBID);
String clientName = c.getString(TAG_JOB_CLIENT_NAME);
String status = c.getString(TAG_JOB_STATUS);
String description = c.getString(TAG_JOB_DESCRIPTION);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_JOB_JOBID, jobid);
map.put(TAG_JOB_CLIENT_NAME, "Client : "+clientName);
map.put(TAG_JOB_STATUS, status);
map.put(TAG_JOB_DESCRIPTION, description);
jobsList.add(map);
}
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url)
{
if(success == 1)
{
myAdapter.updateList(jobsList);
}
}
}
class searchUpdateJobs extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* getting All products from url
* */
protected String doInBackground(String... args) {
jobsList.clear();
myAdapter.clear();
jobs = null;
success = 0;
SharedPreferences pref = getApplicationContext().getSharedPreferences("USER_SESSION", 0);
String session_username = pref.getString("username", null);
String session_key = pref.getString("key", null);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", "view_all_jobs"));
params.add(new BasicNameValuePair("username", session_username));
params.add(new BasicNameValuePair("key", session_key ));
params.add(new BasicNameValuePair("keyword", query ));
params.add(new BasicNameValuePair("page", String.valueOf(page)));
JSONObject json = jsonParser.makeHttpRequest(display_jobs_url, "POST", params);
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
jobs = json.getJSONArray(TAG_JOBS);
for (int i = 0; i < jobs.length(); i++) {
JSONObject c = jobs.getJSONObject(i);
String jobid = c.getString(TAG_JOB_JOBID);
String clientName = c.getString(TAG_JOB_CLIENT_NAME);
String status = c.getString(TAG_JOB_STATUS);
String description = c.getString(TAG_JOB_DESCRIPTION);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_JOB_JOBID, jobid);
map.put(TAG_JOB_CLIENT_NAME, "Client : "+clientName);
map.put(TAG_JOB_STATUS, status);
map.put(TAG_JOB_DESCRIPTION, description);
jobsList.add(map);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
myAdapter.updateList(jobsList);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.display_edit_instruments, menu);
searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
searchView.setSubmitButtonEnabled(true);
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
return true;
}
@Override
public void onScroll(AbsListView view, int firstVisible,
int visibleCount, int totalCount) {
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if ((scrollState == SCROLL_STATE_IDLE) && (query.equals(""))) {
if (lv.getLastVisiblePosition() >= lv.getCount() - 1 - threshold) {
final int index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
final int top = (v == null) ? 0 : v.getTop();
currentPage++;
page++;
new updateJobs().execute();
lv.setSelectionFromTop(index, top);
}
}
}
class Aleph0 extends BaseAdapter {
int count = 10;
public int getCount() { return count; }
public Object getItem(int pos) { return pos; }
public long getItemId(int pos) { return pos; }
public View getView(int pos, View v, ViewGroup p) {
if(pos!=count-1)
{
TextView view = new TextView(DisplayEditJobs.this);
view.setText("entry " + pos);
return view;
}
TextView view = new TextView(DisplayEditJobs.this);
view.setText("Loading.. " + pos);
return view;
}
}
@Override
public boolean onQueryTextChange(String newText) {
if (!TextUtils.isEmpty(newText))
{
query = newText.toString();
new searchUpdateJobs().execute();
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
}
答案 0 :(得分:1)
经过更多的挖掘和测试后,我找到了一个快速的解决方法。这可能不是最好的解决方案,因为我每次调用类都重置适配器
protected void onPostExecute(String file_url) {
HashSet<HashMap<String, String>> unique = new HashSet<HashMap<String, String>>();
unique.addAll(jobsList);
jobsList.clear();
jobsList.addAll(unique);
//this resets the adapter
myAdapter = new JobsAdapter(DisplayEditJobs.this, R.layout.list_edit_job_item, jobsList);
lv.setAdapter(myAdapter);
}
我确信这比实际的更新方法更耗费资源。如果有人有任何想法,我愿意接受任何建议。