ListView没有反映notifyDataSetChanged()的更改

时间:2014-03-03 10:38:59

标签: java android listview android-listview

我在做什么 ::

  • 我有三个按钮
  • 当我点击任何一个按钮时,它必须清除适配器和放大器。分配 新价值。
  • 新值必须反映在列表视图中

问题 ::

  • 我的列表视图未反映按钮
  • 的更改
  • 无日志错误

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



}

2 个答案:

答案 0 :(得分:3)

private void sortListView(

中的

在调用notifyDataSetChanged之前,您应该将新数据集提交给适配器。否则,您只链接片段内的数据。你可以创建一个新的Adapter并再次调用setListAdapter,或者在Adapter中创建一个方法来更新数据集。例如:

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

并在

之前调用它
listViewAdapter.notifyDataSetChanged(); 

答案 1 :(得分:0)

当您排序时,您实际上已添加到arrayListBuffet,但这可能不是您唯一的问题。您正在做的是对不在适配器内的数组进行排序,您需要将新排序的数据(在您的情况下arrayListBuffet)传递回适配器,然后再调用notifyDataSetChanged

为什么?因为如果不这样做,那么适配器使用的数据仍然是您初始化时的数据,因此您将看不到任何更改。换句话说,你并没有真正改变它正在使用的数据集。

如何?您可以在适配器中创建方法并将新排序的数据源作为参数传递,替换原始内容,您实际上可以从同一个内部调用notifyDataSetChanged方法

<强>代码 在适配器中:

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