无法应用自定义适配器notifyDataSetChanged()

时间:2015-07-12 10:56:11

标签: android adapter listadapter 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);
        }

customAdapterVenues

/ **  *由Shubham于2015年6月21日创建。  * /

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();


}

}

这对我有用。但问题是每次将项目添加到listview时,适配器从起始位置开始打印,从而在应用程序中产生小的延迟。我想要的是让它开始显示已经添加的列表项目,并且之前的项目保持不变并且不受其影响。 我可以使用notifyDataSetChanged以及在哪里添加它,因为我已经尝试了但是它不起作用。 另外,有时我会收到错误&#39; - 适配器内容已更改但列表视图 - 未接收通知&#39;。为此,我在VenueSQL1活动中添加了线程。这是对的吗?

2 个答案:

答案 0 :(得分:0)

只要添加新项目,只需将新项目添加到您的案例中的数据结构中。

别忘了打电话。 myadapter.notifysetdatachanged(); 它将在列表视图中反映新数据。

答案 1 :(得分:0)

对于滞后程序,可以在getView方法中使用ViewHolder模式 每当你向你添加新数据arraylist jst使用你的适配器对象与notifyDataSetChanged() 它会起作用