简体   繁体   中英

ListView not reflecting the change for notifyDataSetChanged()

What I am doing ::

  • I have three buttons
  • When I click any one of the button, it must clear adapter & Assign the newvalues.
  • The newvalues must reflect in the listview

Problem ::

  • My listview is not reflecting the changes onclick of Button
  • No log Errors

DisplayBuffet_NotifyDataSetChanged_Fragment.java

public class DisplayBuffet_NotifyDataSetChanged_Fragment extends Fragment implements View.OnClickListener{
    // Declaration
    static ListView xmlFragmentListView;
    static View layout;
    static DisplayBuffetAsyncTask downloadTask=null;
    Button btnRating,btnPrice,btnDistance;
    private FileCache fileCache=null;
    private MemoryCache memoryCache=null;
    DisplayBuffetAdapter listViewAdapter;

    static Bundle bundle=null;
    DisplayBuffet_Json_Fragment fragment=null;

    ArrayList<HashMap<String, String>> arrayListBuffet=null;
    FindMyBuffetDatabaseHelper mHelper=null;;
    SQLiteDatabase database=null;

    public static DisplayBuffet_NotifyDataSetChanged_Fragment newInstance(FileCache _fileCache,MemoryCache _memoryCache) {
        DisplayBuffet_NotifyDataSetChanged_Fragment fragment = new DisplayBuffet_NotifyDataSetChanged_Fragment();
        bundle = new Bundle();
        bundle.putSerializable(FindMyBuffetConstants.BUFFET_FILECACHE_KEY,  _fileCache);
        bundle.putSerializable(FindMyBuffetConstants.BUFFET_MEMORYCACHE_KEY,  _memoryCache);
        fragment.setArguments(bundle);
        return fragment;
      }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retain this fragment across configuration changes.
        setRetainInstance(true);

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        layout = inflater.inflate(R.layout.display_buffets_fragment,container, false);

        return layout;
    }

    private void initViews() { 
        fileCache = (FileCache) getArguments().getSerializable(FindMyBuffetConstants.BUFFET_FILECACHE_KEY);
        memoryCache = (MemoryCache) getArguments().getSerializable(FindMyBuffetConstants.BUFFET_MEMORYCACHE_KEY);
        xmlFragmentListView = ((ListView) layout.findViewById(R.id.sortrestaurantlistview));
        btnRating=(Button) getActivity().findViewById(R.id.btnRating);
        btnPrice=(Button) getActivity().findViewById(R.id.btnPrice);
        btnDistance=(Button) getActivity().findViewById(R.id.btnDistance);
    } 

    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

    }
    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        arrayListBuffet = new ArrayList<HashMap<String, String>>();
        mHelper = new FindMyBuffetDatabaseHelper(FindMyBuffetApplication.currentActivityContext);
        database = mHelper.getWritableDatabase();
        initViews(); 
        btnRating.setOnClickListener(this);
        btnPrice.setOnClickListener(this);
        btnDistance.setOnClickListener(this);

        setListViewAdapter();

    }

    @Override
       public void onClick(View v) {
        String strOrder="asc";
        if (FindMyBuffetApplication.isRatingOrderByDesc == false && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_RATING)){
            btnRating.setBackgroundResource(R.drawable.tab_button_foucs_asc);
            btnPrice.setBackgroundResource(R.drawable.tab_button_default);
            btnDistance.setBackgroundResource(R.drawable.tab_button_default);
        }
        else if (FindMyBuffetApplication.isPriceOrderByDesc == false && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_PRICE)){
            btnPrice.setBackgroundResource(R.drawable.tab_button_foucs_asc);
            btnRating.setBackgroundResource(R.drawable.tab_button_default);
            btnDistance.setBackgroundResource(R.drawable.tab_button_default);
        }
        else if (FindMyBuffetApplication.isDistanceOrderByDesc == false && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_DISTANCE)){
            btnDistance.setBackgroundResource(R.drawable.tab_button_foucs_asc);
            btnRating.setBackgroundResource(R.drawable.tab_button_default);
            btnPrice.setBackgroundResource(R.drawable.tab_button_default);
        }
        else if (FindMyBuffetApplication.isRatingOrderByDesc == true && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_RATING)){
            btnRating.setBackgroundResource(R.drawable.tab_button_foucs_dec);
            btnDistance.setBackgroundResource(R.drawable.tab_button_default);
            btnPrice.setBackgroundResource(R.drawable.tab_button_default);
        }
        else if (FindMyBuffetApplication.isPriceOrderByDesc == true && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_PRICE)){
            btnPrice.setBackgroundResource(R.drawable.tab_button_foucs_dec);
            btnDistance.setBackgroundResource(R.drawable.tab_button_default);
            btnRating.setBackgroundResource(R.drawable.tab_button_default);
        }
        else if (FindMyBuffetApplication.isDistanceOrderByDesc == true && FindMyBuffetApplication.sortBy.equalsIgnoreCase(FindMyBuffetConstants.TAB_NAME_DISTANCE)){
            btnDistance.setBackgroundResource(R.drawable.tab_button_foucs_dec);
            btnPrice.setBackgroundResource(R.drawable.tab_button_default);
            btnRating.setBackgroundResource(R.drawable.tab_button_default);
        }
           switch(v.getId()) {
               case R.id.btnRating:
                   FindMyBuffetApplication.sortBy = FindMyBuffetConstants.TAB_NAME_RATING;

                    if (FindMyBuffetApplication.isRatingOrderByDesc == false)
                        FindMyBuffetApplication.isRatingOrderByDesc = true;
                    else
                        FindMyBuffetApplication.isRatingOrderByDesc = false;

                    //displayView();
                    if(FindMyBuffetApplication.isRatingOrderByDesc==true)strOrder="desc";
                    sortListView(FindMyBuffetConstants.SORT_BY_RATING_1,strOrder);
               break;
               case R.id.btnPrice:
                   FindMyBuffetApplication.sortBy = FindMyBuffetConstants.TAB_NAME_PRICE;

                    if (FindMyBuffetApplication.isPriceOrderByDesc == false)
                        FindMyBuffetApplication.isPriceOrderByDesc = true;
                    else
                        FindMyBuffetApplication.isPriceOrderByDesc = false;

                    //displayView();
                    if(FindMyBuffetApplication.isPriceOrderByDesc==true)strOrder="desc";
                    sortListView(FindMyBuffetConstants.SORT_BY_PRICE_1,strOrder);
               break;
               case R.id.btnDistance:
                   FindMyBuffetApplication.sortBy = FindMyBuffetConstants.TAB_NAME_DISTANCE;

                    if (FindMyBuffetApplication.isDistanceOrderByDesc == false)
                        FindMyBuffetApplication.isDistanceOrderByDesc = true;
                    else
                        FindMyBuffetApplication.isDistanceOrderByDesc = false;

                    //displayView();
                    if(FindMyBuffetApplication.isPriceOrderByDesc==true)strOrder="desc";
                    sortListView(FindMyBuffetConstants.SORT_BY_DISTANCE_1,strOrder);
                   break;
           }
       }
    private void setListViewAdapter(){
        downloadTask = new DisplayBuffetAsyncTask();

        if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_RATING){
            if (FindMyBuffetApplication.isDownloading) {
                downloadTask.initilizeAsyncTask(
                        getFragmentManager(), xmlFragmentListView,downloadTask, 
                        fileCache,memoryCache);
                downloadTask.execute();
            }
        }
        else if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_PRICE){
            if (FindMyBuffetApplication.isDownloading) {
                downloadTask.initilizeAsyncTask(
                        getFragmentManager(), xmlFragmentListView,
                        downloadTask, 
                        fileCache,memoryCache);
                downloadTask.execute();
            }
        }
        else if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_DISTANCE){
            if (FindMyBuffetApplication.isDownloading) {
                downloadTask.initilizeAsyncTask(
                        getFragmentManager(), xmlFragmentListView,
                        downloadTask, 
                        fileCache,memoryCache);
                downloadTask.execute();
            } 
        } 

        listViewAdapter = new DisplayBuffetAdapter(arrayListBuffet, fileCache,memoryCache);
        xmlFragmentListView.setAdapter(listViewAdapter);
    }


     private void sortListView(String strSortBy,String strOrder) {  

        arrayListBuffet.clear();

        if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_RATING) {
            SortBuffets(FindMyBuffetConstants.SORT_BY_RATING_1, strOrder);
        } else if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_PRICE) {
            SortBuffets(FindMyBuffetConstants.SORT_BY_PRICE_1, strOrder);
        } else if (FindMyBuffetApplication.sortBy == FindMyBuffetConstants.TAB_NAME_DISTANCE) {
            SortBuffets(FindMyBuffetConstants.SORT_BY_DISTANCE_1, strOrder);
        }
        listViewAdapter.notifyDataSetChanged();  
    }

    /*@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
    }*/

    private void displayView() {

        Fragment objFragment = getFragmentManager().findFragmentById(getId());

        if (objFragment != null) {
            getFragmentManager().beginTransaction().remove(objFragment).commit();
            //objFragment = new SortBuffetRating();
            objFragment = DisplayBuffet_Json_Fragment.newInstance(fileCache,memoryCache);
            getFragmentManager().beginTransaction().add(R.id.frame_container, objFragment).commit();
        } else {
            //objFragment = new SortBuffetRating();
            objFragment = DisplayBuffet_Json_Fragment.newInstance(fileCache,memoryCache);
            getFragmentManager().beginTransaction().add(R.id.frame_container, objFragment).commit();
        }
    }

    /*
    * Displays data from SQLite
    */
    private void SortBuffets(String strSortBy,String strOrder){
        Cursor mCursor = database.rawQuery("select * from " + BuffetTable.TABLE_NAME_BUFFET + " order by " + strSortBy +" "+strOrder, null);

        try {

                // looping through all rows and adding to list
                if (mCursor.moveToFirst()) {
                    do {
                        HashMap<String, String> map=new HashMap<String, String>();
                        map.put(BuffetTable.COLUMN_ID,mCursor.getString(0));
                        map.put(BuffetTable.COLUMN_BUF_OFF_ID,mCursor.getString(1));
                        map.put(BuffetTable.COLUMN_FROM_TIME,mCursor.getString(2));
                        map.put(BuffetTable.COLUMN_TO_TIME,mCursor.getString(3));
                        map.put(BuffetTable.COLUMN_ONLINE_PRICE,mCursor.getString(4));
                        map.put(BuffetTable.COLUMN_RESERVED_PRICE,mCursor.getString(5));
                        map.put(BuffetTable.COLUMN_BUF_IMAGE_FILE_NAME,mCursor.getString(6));
                        map.put(BuffetTable.COLUMN_RES_NAME,mCursor.getString(7));
                        map.put(BuffetTable.COLUMN_RATING,mCursor.getString(8));
                        map.put(BuffetTable.COLUMN_LATITUDE,mCursor.getString(9));
                        map.put(BuffetTable.COLUMN_LONGITUDE,mCursor.getString(10));
                        map.put(BuffetTable.COLUMN_BUF_TYPE_NAME,mCursor.getString(11));

                        arrayListBuffet.add(map);
                    } while (mCursor.moveToNext());
                }

        }catch (SQLiteException e){
            Log.i(FindMyBuffetApplication.applicationName+"."+FindMyBuffetConstants.PACKAGE_NAME+"."+FindMyBuffetConstants.PACKAGE_NAME,"Error Druing Sorting Buffets "+ e.getMessage());
            e.printStackTrace();
            Toast.makeText(FindMyBuffetApplication.currentActivityContext, "Error Druing Sorting The Buffets By" +strSortBy,Toast.LENGTH_LONG).show();
        }catch (Exception e) {
            Log.i(FindMyBuffetApplication.applicationName+"."+FindMyBuffetConstants.PACKAGE_NAME+"."+FindMyBuffetConstants.PACKAGE_NAME,"Error Druing Sorting Buffets "+ e.getMessage());
            e.printStackTrace();
            Toast.makeText(FindMyBuffetApplication.currentActivityContext, "Error Druing Sorting The Buffets By" +strSortBy,Toast.LENGTH_LONG).show();
        }finally {
            // Release the memory
            mCursor.close();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        database.close();
        //layout = null; // now cleaning up!
        //bundle = null;
        /*fragment = null;
        if (downloadTask != null && downloadTask.getStatus() != AsyncTask.Status.FINISHED)
            downloadTask=null;*/
    }
}

DisplayBuffetAdapter.java

public class DisplayBuffetAdapter extends BaseAdapter {

    // Declare Variables
    ImageLoader imageLoader;
    ArrayList<HashMap<String, String>> arrayListBuffet;
    LayoutInflater inflater;
    FileCache fileCache=null;
    MemoryCache memoryCache=null;
    int tmpLoopCnt=0;

    public DisplayBuffetAdapter(ArrayList<HashMap<String, String>> _arraylist,FileCache _fileCache,MemoryCache _memoryCache) {
        this.arrayListBuffet = _arraylist;
        this.fileCache=_fileCache;
        this.memoryCache=_memoryCache;
        this.imageLoader=new ImageLoader(FindMyBuffetApplication.currentActivityContext,fileCache,memoryCache);
        tmpLoopCnt=0;
    }


    public int getCount() {
        return arrayListBuffet.size();
    }

    public Object getItem(int position) {
        return arrayListBuffet.get(position);  

    }

    public long getItemId(int position) {
        return position;
    }

    private class ViewHolder {
        // Declare Variables
        ImageView imgRestBuffLogo;
        TextView txtResName;
        TextView txtRestBufType;
        TextView txtRestTime;
        TextView txtRestDistance;
        TextView txtReservePrice;
        TextView txtOnlinePrice;
        RatingBar restRatingBar;
        Button btnOnlinePrice;
        Button btnReservedPrice;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        tmpLoopCnt = tmpLoopCnt + 1;
        Log.i("LIST VIEW ADAPATER COUNT", ""+tmpLoopCnt);
        ViewHolder holder;
        LayoutInflater inflater;
        if (convertView == null) {
            inflater = (LayoutInflater) FindMyBuffetApplication.currentActivityContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.display_buffet_listview, null);
            holder = new ViewHolder();

            Typeface txtResnameFontFace=Typeface.createFromAsset(FindMyBuffetApplication.currentActivityContext.getAssets(), "Roboto-Bold.ttf");
            Typeface txtRestBufTypeFontFace=Typeface.createFromAsset(FindMyBuffetApplication.currentActivityContext.getAssets(), "Roboto-Medium.ttf");
            Typeface txtRestTimeFontFace=Typeface.createFromAsset(FindMyBuffetApplication.currentActivityContext.getAssets(), "Roboto-Bold.ttf");
            //Typeface txtReservePrice=Typeface.createFromAsset(FindMyBuffetApplicationCls.currentActivityContext.getAssets(),"Roboto-Bold.ttf");
            //Typeface txtOnlinePrice=Typeface.createFromAsset(FindMyBuffetApplicationCls.currentActivityContext.getAssets(),"Roboto-Bold.ttf");
            Typeface btnPrice=Typeface.createFromAsset(FindMyBuffetApplication.currentActivityContext.getAssets(), "Roboto-Bold.ttf");
            Typeface txtRestDistanceFontFace=Typeface.createFromAsset(FindMyBuffetApplication.currentActivityContext.getAssets(),"Roboto-Light.ttf");

            // Locate the TextViews in listview_item.xml
            holder.txtResName = (TextView) convertView.findViewById(R.id.txtRestName);
            holder.txtResName.setTypeface(txtResnameFontFace);
            holder.txtRestBufType = (TextView) convertView.findViewById(R.id.txtRestBufType);
            holder.txtRestBufType.setTypeface(txtRestBufTypeFontFace);
            holder.txtRestTime = (TextView) convertView.findViewById(R.id.txtRestTime);
            holder.txtRestTime.setTypeface(txtRestTimeFontFace);
            holder.txtRestDistance = (TextView) convertView.findViewById(R.id.txtRestDistance);
            holder.txtRestDistance.setTypeface(txtRestDistanceFontFace);
            holder.restRatingBar=(RatingBar) convertView.findViewById(R.id.restRatingBar);
            //holder.txtReservePrice = (TextView) convertView.findViewById(R.id.txtReservePrice);
            //holder.txtReservePrice.setTypeface(txtReservePrice);
            //holder.txtOnlinePrice = (TextView) convertView.findViewById(R.id.txtOnlinePrice);
            //holder.txtOnlinePrice.setTypeface(txtOnlinePrice);
            holder.btnOnlinePrice=(Button) convertView.findViewById(R.id.btnOnlinePrice);
            holder.btnOnlinePrice.setTypeface(btnPrice);
            holder.btnReservedPrice=(Button) convertView.findViewById(R.id.btnReservedPrice);
            holder.btnOnlinePrice.setTypeface(btnPrice);
            // Locate the ImageView in listview_item.xml
            holder.imgRestBuffLogo = (ImageView) convertView.findViewById(R.id.imgRestBuffetLogo);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        HashMap<String, String> objMap= arrayListBuffet.get(position);
        holder.txtResName.setText(objMap.get(BuffetTable.COLUMN_RES_NAME));
        holder.txtRestBufType.setText(objMap.get(BuffetTable.COLUMN_BUF_TYPE_NAME));
        holder.restRatingBar.setRating(Float.valueOf(objMap.get(BuffetTable.COLUMN_RATING)));

        holder.txtRestTime.setText(formatTime(objMap.get(BuffetTable.COLUMN_FROM_TIME))+" to "+formatTime(objMap.get(BuffetTable.COLUMN_TO_TIME)));

        //txtOnlinePrice.setText(objMap.get("Online_Price"));
        //txtReservePrice.setText(objMap.get("Reserved_Price"));
        holder.btnOnlinePrice.setText("             Buy Now\n             "+"Rs."+objMap.get(BuffetTable.COLUMN_ONLINE_PRICE)+" ");
        holder.btnReservedPrice.setText("             Reserve\n             "+"Rs."+objMap.get(BuffetTable.COLUMN_RESERVED_PRICE)+" ");

        //double dist=objMap.get("Latitude")-objMap.get("Longitude");
        //txtRestDistance.setText(String.valueOf(dist));
        holder.txtRestDistance.setText(""+10+position+" Km");
        String strUrl=FindMyBuffetApplication.URL+FindMyBuffetConstants.WEB_SERVER_PATH_BUF_IMAGE+objMap.get(BuffetTable.COLUMN_BUF_IMAGE_FILE_NAME);
        imageLoader.DisplayImage(strUrl,holder.imgRestBuffLogo);
        return convertView;
    }

    private String formatTime(String strTime){

        //example For hour,minutes and seconds
        // String strTime = "15:30:18 pm";
        //SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss a");
        strTime=strTime.substring(0,5)+" am"; 
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
        Date date = null;
        try {
            date = sdf.parse(strTime);
        } catch (java.text.ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return sdf.format(date);
    }



}

in private void sortListView(

before calling notifyDataSetChanged , you should submit the new dataset to your adapter. Otherwise you are only chaining the data inside the fragment. You could this both creating a new Adapter and calling setListAdapter again, or creating a method inside the Adapter to update the dataset. For instance:

public void updateData(ArrayList<HashMap<String, String>> _arraylist) {
  this.arrayListBuffet = _arraylist;
}

and call it before

listViewAdapter.notifyDataSetChanged(); 

When you sort you are in fact adding to arrayListBuffet but that may not be your only problem. What you're doing is sorting an array that's not inside the adapter, you need to pass the newly sorted data, in your case arrayListBuffet back to the adapter before calling notifyDataSetChanged

Why? Because if you don't, the data that the adapter is using is still the one from when you initialised it, and therefore you'll see no changes. In other words, you didn't really change the dataset it's using.

How? You can create a method in your adapter and pass the newly sorted data source as a parameter, replacing the original content, you can actually call the notifyDataSetChanged from within that same method.

Code In your adapter:

public void updateDataSource(ArrayList<HashMap<String, String>> sortedArrayListBuffet) {
    this.arrayListBuffet = sortedArrayListBuffet;
    this.notifyDataSetChanged();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM