无法应用自定义适配器 notifyDataSetChanged()
Unable to apply Custom Adapter notifyDataSetChanged()
抱歉,如果您发现此问题重复。但是我已经查看了所有其他解决方案,但我无法找到任何解决我应用 notifyDataSetChanged() 问题的方法。
我当前的代码:来自 VenueSQL1 Activity 我正在调用自定义适配器
protected void onPostExecute(Void result) {
try{
super.onPostExecute(result);
// Dismiss the progress dialog
if(count==1){
if (pDialog.isShowing())
pDialog.dismiss();
count++;
}
state = lv.onSaveInstanceState();
final ListAdapter myadapter=new customAdapterVenues(VenueSQL1.this,contactList1);
runOnUiThread(new Runnable() {
public void run() {
lv.setAdapter(myadapter);
}
});
lv.onRestoreInstanceState(state);
}
自定义适配器场地
/**
* 由 Shubham 创建于 6/21/2015。
*/
public class customAdapterVenues extends ArrayAdapter<HashMap<String, String>>{
private Context mcontext;
public String unique_id1,Cost1,Type1,Name1;
public ArrayList<Integer> flags=new ArrayList<>();
static final ArrayList<Integer> set=new ArrayList<>();
String android_id,android_id1;
String unique_id,Name,Type="weddinghalls",Cost;
int flag=0;
int pos=0;
public customAdapterVenues(Context context, ArrayList<HashMap<String, String>> main) {
super(context, R.layout.list_item, main);
// this.notifyDataSetChanged();
mcontext=context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater shubhamsinflator=LayoutInflater.from(getContext());
View customview=shubhamsinflator.inflate(R.layout.list_item, parent, false);
android_id = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
//this.notifyDataSetChanged();
try {
flag=0;
flags.add(position,0);
// set.add(position,0);
HashMap<String, String> map = (HashMap<String, String>) getItem(position);
final String name1 = map.get("Name");
Name=name1;
Log.d("flag:",String.valueOf(position));
String address1 = map.get("Area");
String image = map.get("Image");
String cost = map.get("Cost");
// if(set.get(position)==0) {
unique_id = map.get("UniqueId");
// set.set(position, 1);
//}
android_id1=map.get("UserId");
Cost=cost;
final String phone = map.get("Telephone");
//phone=phone.replace(" ","");
// String name1 = map.get("name");
//String name1=getItem(position).
TextView shubhamsText = (TextView) customview.findViewById(R.id.name);
TextView shubhamsText2 = (TextView) customview.findViewById(R.id.address);
TextView shubhamsText3 = (TextView) customview.findViewById(R.id.price);
TextView shubhamsText4 = (TextView) customview.findViewById(R.id.price1);
ImageView shubhamsimage = (ImageView) customview.findViewById(R.id.imageView2);
com.example.shubham.myapp.CircleImageView call = (com.example.shubham.myapp.CircleImageView) customview.findViewById(R.id.but);
call.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent callIntent = new Intent(Intent.ACTION_CALL);
//callIntent.setData(Uri.parse("tel:" + phone));
//getContext().startActivity(callIntent);
myDialog(name1, phone);
}
}
);
shubhamsText.setText(name1);
shubhamsText2.setText(address1);
//cost = cost.replace("Per Plate", "");
shubhamsText3.setText("Rs. "+cost);
shubhamsText4.setText("Per Plate");
if (cost.equals("0")) {
shubhamsText3.setText("Price on");
shubhamsText4.setText("Request");
// shubhamsText3.setText(" ");
if (!image.equals("NA"))
Picasso.with(getContext()).load(image).into((ImageView) customview.findViewById(R.id.imageView2));
else
shubhamsimage.setImageResource(R.drawable.ina);
//shubhamsimage.setImageResource(p);
}catch (Exception e){
Log.d("Hello","hello");
}
return customview;
//return super.getView(position, convertView, parent);
}
private ProgressDialog pDialog;
private AlertDialog.Builder dialogBuilder;
public static final int CONNECTION_TIMEOUT=1000*15;
public static final String SERVER_ADDRESS="http://shubhamsapp.esy.es/";
private void myDialog(String name1, final String phone)
{
dialogBuilder=new AlertDialog.Builder(getContext());
dialogBuilder.setTitle(name1+"\n"+" " +phone);
dialogBuilder.setPositiveButton("Call", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int w) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + phone));
getContext().startActivity(callIntent);
}
});
dialogBuilder.setNegativeButton("Don't Call",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int w) {
//Intent callIntent = new Intent(Intent.ACTION_CALL);
//callIntent.setData(Uri.parse("tel:" + phone));
//getContext().startActivity(callIntent);
}
});
AlertDialog dialog=dialogBuilder.create();
//dialog.setTitle("Hey");
dialog.show();
}
}
这对我有用。但问题是每次将项目添加到列表视图时,适配器都会从起始位置开始打印,从而在应用程序中产生小的滞后。我想要的是让它从最近添加的列表项开始显示,之前的项目保持原样并且不受其影响。
我可以使用 notifyDataSetChanged 来完成它吗,以及在哪里添加它,因为我在任何地方都尝试过但它不起作用。
有时我也会收到错误“适配器的内容已更改但列表视图没有收到通知”。为此,我在 VenueSQL1 activity 中添加了线程。正确吗?
只需将新项目添加到您的情况下的数据结构到 hashmap 中,每当添加新项目时。
别忘了打电话。
myadapter.notifysetdatachanged();
它将在您的列表视图中反映新数据。
为了让你的程序滞后,你可以在 getView 方法中使用 ViewHolder 模式
每当您向数组列表添加新数据时,都会使用带有 notifyDataSetChanged() 的适配器对象
它会起作用
抱歉,如果您发现此问题重复。但是我已经查看了所有其他解决方案,但我无法找到任何解决我应用 notifyDataSetChanged() 问题的方法。
我当前的代码:来自 VenueSQL1 Activity 我正在调用自定义适配器
protected void onPostExecute(Void result) {
try{
super.onPostExecute(result);
// Dismiss the progress dialog
if(count==1){
if (pDialog.isShowing())
pDialog.dismiss();
count++;
}
state = lv.onSaveInstanceState();
final ListAdapter myadapter=new customAdapterVenues(VenueSQL1.this,contactList1);
runOnUiThread(new Runnable() {
public void run() {
lv.setAdapter(myadapter);
}
});
lv.onRestoreInstanceState(state);
}
自定义适配器场地
/** * 由 Shubham 创建于 6/21/2015。 */
public class customAdapterVenues extends ArrayAdapter<HashMap<String, String>>{
private Context mcontext;
public String unique_id1,Cost1,Type1,Name1;
public ArrayList<Integer> flags=new ArrayList<>();
static final ArrayList<Integer> set=new ArrayList<>();
String android_id,android_id1;
String unique_id,Name,Type="weddinghalls",Cost;
int flag=0;
int pos=0;
public customAdapterVenues(Context context, ArrayList<HashMap<String, String>> main) {
super(context, R.layout.list_item, main);
// this.notifyDataSetChanged();
mcontext=context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater shubhamsinflator=LayoutInflater.from(getContext());
View customview=shubhamsinflator.inflate(R.layout.list_item, parent, false);
android_id = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
//this.notifyDataSetChanged();
try {
flag=0;
flags.add(position,0);
// set.add(position,0);
HashMap<String, String> map = (HashMap<String, String>) getItem(position);
final String name1 = map.get("Name");
Name=name1;
Log.d("flag:",String.valueOf(position));
String address1 = map.get("Area");
String image = map.get("Image");
String cost = map.get("Cost");
// if(set.get(position)==0) {
unique_id = map.get("UniqueId");
// set.set(position, 1);
//}
android_id1=map.get("UserId");
Cost=cost;
final String phone = map.get("Telephone");
//phone=phone.replace(" ","");
// String name1 = map.get("name");
//String name1=getItem(position).
TextView shubhamsText = (TextView) customview.findViewById(R.id.name);
TextView shubhamsText2 = (TextView) customview.findViewById(R.id.address);
TextView shubhamsText3 = (TextView) customview.findViewById(R.id.price);
TextView shubhamsText4 = (TextView) customview.findViewById(R.id.price1);
ImageView shubhamsimage = (ImageView) customview.findViewById(R.id.imageView2);
com.example.shubham.myapp.CircleImageView call = (com.example.shubham.myapp.CircleImageView) customview.findViewById(R.id.but);
call.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent callIntent = new Intent(Intent.ACTION_CALL);
//callIntent.setData(Uri.parse("tel:" + phone));
//getContext().startActivity(callIntent);
myDialog(name1, phone);
}
}
);
shubhamsText.setText(name1);
shubhamsText2.setText(address1);
//cost = cost.replace("Per Plate", "");
shubhamsText3.setText("Rs. "+cost);
shubhamsText4.setText("Per Plate");
if (cost.equals("0")) {
shubhamsText3.setText("Price on");
shubhamsText4.setText("Request");
// shubhamsText3.setText(" ");
if (!image.equals("NA"))
Picasso.with(getContext()).load(image).into((ImageView) customview.findViewById(R.id.imageView2));
else
shubhamsimage.setImageResource(R.drawable.ina);
//shubhamsimage.setImageResource(p);
}catch (Exception e){
Log.d("Hello","hello");
}
return customview;
//return super.getView(position, convertView, parent);
}
private ProgressDialog pDialog;
private AlertDialog.Builder dialogBuilder;
public static final int CONNECTION_TIMEOUT=1000*15;
public static final String SERVER_ADDRESS="http://shubhamsapp.esy.es/";
private void myDialog(String name1, final String phone)
{
dialogBuilder=new AlertDialog.Builder(getContext());
dialogBuilder.setTitle(name1+"\n"+" " +phone);
dialogBuilder.setPositiveButton("Call", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int w) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + phone));
getContext().startActivity(callIntent);
}
});
dialogBuilder.setNegativeButton("Don't Call",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int w) {
//Intent callIntent = new Intent(Intent.ACTION_CALL);
//callIntent.setData(Uri.parse("tel:" + phone));
//getContext().startActivity(callIntent);
}
});
AlertDialog dialog=dialogBuilder.create();
//dialog.setTitle("Hey");
dialog.show();
}
}
这对我有用。但问题是每次将项目添加到列表视图时,适配器都会从起始位置开始打印,从而在应用程序中产生小的滞后。我想要的是让它从最近添加的列表项开始显示,之前的项目保持原样并且不受其影响。 我可以使用 notifyDataSetChanged 来完成它吗,以及在哪里添加它,因为我在任何地方都尝试过但它不起作用。 有时我也会收到错误“适配器的内容已更改但列表视图没有收到通知”。为此,我在 VenueSQL1 activity 中添加了线程。正确吗?
只需将新项目添加到您的情况下的数据结构到 hashmap 中,每当添加新项目时。
别忘了打电话。 myadapter.notifysetdatachanged(); 它将在您的列表视图中反映新数据。
为了让你的程序滞后,你可以在 getView 方法中使用 ViewHolder 模式 每当您向数组列表添加新数据时,都会使用带有 notifyDataSetChanged() 的适配器对象 它会起作用