简体   繁体   English

ListView没有反映notifyDataSetChanged()的更改

[英]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 我的列表视图没有反映出Button的变化
  • No log Errors 没有日志错误

DisplayBuffet_NotifyDataSetChanged_Fragment.java 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 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( private void sortListView(

before calling notifyDataSetChanged , you should submit the new dataset to your adapter. 在调用notifyDataSetChanged之前,您应该将新数据集提交给适配器。 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. 你可以创建一个新的Adapter并再次调用setListAdapter,或者在Adapter中创建一个方法来更新数据集。 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. 当您排序时,实际上是在添加到arrayListBuffet但这可能不是您唯一的问题。 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 您正在做的是对不在适配器内部的数组进行排序,您需要调用notifyDataSetChanged 之前将新排序的数据(在您的情况下为arrayListBuffet回适配器

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. 您可以在适配器中创建方法并将新排序的数据源作为参数传递,替换原始内容,您实际上可以在同一方法中调用notifyDataSetChanged

Code In your adapter: 代码在适配器中:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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