我正在尝试使用listactivity,我将项目添加到listview行。但是当我加载不同的数据来添加列表视图中的项目时,它会重复之前添加的相同项目。Android Listview项目重复添加具有不同数据的新项目
这里是我的baseadapter类:
public class MyNotiAdapter extends BaseAdapter {
Context context;
String[] data;
String time;
String Name ;
String Number;
private static LayoutInflater inflater = null;
public MyNotiAdapter(Context context, String[] data,String time, String Name ,String Number) {
// TODO Auto-generated constructor stub
this.context = context;
this.data = data;
this.time = time;
this.Name = Name;
this.Number=Number;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder mHolder;
View vi = convertView;
if (vi == null){
vi = inflater.inflate(R.layout.row2, null);
mHolder = new ViewHolder();
mHolder.text= (TextView) vi.findViewById(R.id.lablel);
mHolder.Nameo = (TextView) vi.findViewById(R.id.person);
mHolder.Numbero = (TextView) vi.findViewById(R.id.edu);
mHolder.Time = (TextView) vi.findViewById(R.id.tym);
vi.setTag(mHolder);
mHolder.text.setText(data[position]);
mHolder.Nameo.setText(Name);
mHolder.Numbero.setText(Number);
mHolder.Time.setText(time);
}else {
mHolder = (ViewHolder) convertView.getTag();
}
return vi;
}
public class ViewHolder {
public TextView text;
public TextView Nameo;
public TextView Numbero;
public TextView Time;
}
}
,这里是在我设置适配器数据的活动......
public class noticall extends ListActivity {
CustomDateTimePicker custom;
TextView tv,tv1;
EditText ed;
String store;
static String Names;
public static final int PICK_CONTACT = 1;
String [] adi ;
static int incre=0;
ArrayList<String> myrows = new ArrayList<String>();
private PendingIntent pendingIntent;
ListView listview;
String temp1 ,temp2 ;
int x=0;
OnItemClickListener listener;
String Date,Time,Name,Number;
MyNotiAdapter adp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notify);
listview = (ListView) findViewById(android.R.id.list);
listview.setDividerHeight(5);
custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() {
@Override
public void onCancel() {
finish();
}
@Override
public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName,
String monthShortName, int monthNumber, int date,
String weekDayFullName, String weekDayShortName,
int hour24, int hour12, int min, int sec,
String AM_PM) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthNumber, date, hour24, min, 0);
long when = calendar.getTimeInMillis(); // notification time
Intent myIntent = new Intent(noticall.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
//temp1= store =calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +
// year + ", " + hour12 + ":" + min + " " + AM_PM;
Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year;
Time = hour12 + ":" + min + " " + AM_PM;
Log.e("Timeee", Time+"");
setlisto(Date);
Toast.makeText(noticall.this, store, Toast.LENGTH_SHORT).show();
}
});
/*
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT);
/**
* Pass Directly current time format it will return AM and PM if you set
* false
*/
custom.set24HourFormat(false);
/**
* Pass Directly current data and time to show when it pop up
*/
custom.setDate(Calendar.getInstance());
//custom.showDialog();
findViewById(R.id.button_date).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT);
custom.showDialog();
incre++;
}
});
// ((BaseAdapter) listview.getAdapter()).notifyDataSetChanged() ;
// listview.getAdapter().notifyAll();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_CANCELED){
if (requestCode == 1)
{
// Get the URI that points to the selected contact
Uri contactUri = data.getData();
// We only need the NUMBER column, because there will be only one row in the result
String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
String[] segments = contactUri.toString().split("/");
String id = segments[segments.length - 1];
// Perform the query on the contact to get the NUMBER column
// We don't need a selection or sort order (there's only one result for the given URI)
// CAUTION: The query() method should be called from a separate thread to avoid blocking
// your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
// Consider using CursorLoader to perform the query.
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast())
{
int cid = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
String contactid = cursor.getString(cid);
if (contactid.equals(id))
{
// Retrieve the phone number from the NUMBER column
int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(column);
// Retrieve the contact name from the DISPLAY_NAME column
int column_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String name = cursor.getString(column_name);
// Do something with the phone number...
// Toast.makeText(this, "I added the Contact: \n" + name + " " + number, Toast.LENGTH_SHORT).show();
// ed.setText(name+" - "+number);
Name= Names=name;
Number =number;
}
cursor.moveToNext();
}
cursor.close();
}
}
}
public void setlisto(String one){
Log.e("setlistoo",one+"");
myrows.add(one);
adi = myrows.toArray(new String[myrows.size()]);
listview.setAdapter(new MyNotiAdapter(noticall.this, adi,Time,Name,Number));
// ((BaseAdapter) listview.getAdapter()).notifyDataSetChanged();
//listview.invalidateViews();
x++;
}
}
我已经通过提供互联网上的所有解决方案了。我想我在某个地方犯了一些错误。如果有人能找到问题所在......?
我只注意到Data []数组正在用不同的值更新。但其他字符串变量覆盖每个项目添加..为什么会发生这种情况?
您可以提供myrows对象类? – faruk
编辑并添加了类 –
@AlZill我认为当将新数据添加到适配器时,它将添加新的数据添加到以前添加的项目中。 –