2013-05-20 36 views
1

我正在編寫一個Android應用程序來列出數據庫中的項目,並將這些項目中的某些標記爲收藏並根據收藏夾更新數據庫。關於在ListView中更改圖像的問題

​​:

當我標記的ListView收藏的特殊項目,該特定列表項的圖像將被改變,表的相應欄應爲最喜歡的更新(是)或不喜歡的(無) 。

工作正常,從數據庫中列出項目,根據喜好更改圖像源,也更新數據庫。

My Problem is

1.當我按特定項目的圖像,該圖像將被改變once,和相應的數據庫也將被改變。但是,點擊相同的圖像another time(上次點擊圖像)does not change anything(不改變圖像,不更新)。

2. By scrolling the listView keep the listview as before changing the listView

我指的是this link,beforeuse database。它工作正常。

我用的數據庫後,我改變了我的代碼如下:

public class EpisodeCursorAdapter extends SimpleCursorAdapter { 

    public final String TAG = "EpisodeCursorAdapter"; 
    //private String strurl = "http://timesofindia.feedsportal.com/c/33039/f/533916/index.rss"; 
    public int favourite[]; 
    private Cursor c,temp_cursor; 
    private Context context; 
    AABDatabaseManager db; 
    public EpisodeCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.c = c; 
     temp_cursor=c; 
     this.context = context; 
     Log.d(TAG, "Object size is:" +c.getCount()); 
//  favourite = new int[c.getCount()]; 
//  for (int i = 0; i < c.getCount(); i++) { 
//   favourite[i] = 0; 
//  } 
    } 

    static class EpisodeHolder { 
     TextView title; 
     TextView desc; 
     ImageView thumbnail, favourite; 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     Log.d(TAG,"NEw view in Cursor adapater"+" "+cursor.getCount()); 
     Cursor cc=getCursor(); 
     Log.d(TAG,"NEw view in Cursor adapater"+" "+cc.getCount()+ " "+cc.getInt(0)); 

     // TODO Auto-generated method stub 
     return super.newView(context, cursor, parent); 
    } 
    public View getView(final int pos, View inView, ViewGroup parent) { 


     Log.d(TAG,"getView view in Cursor adapater " + pos); 
     View v = inView; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.episode_row_view, null); 
      final EpisodeHolder holder = new EpisodeHolder(); 
      db = new AABDatabaseManager(context); 
      holder.title = (TextView) v.findViewById(R.id.title); 
      holder.desc = (TextView) v.findViewById(R.id.description); 
      holder.favourite = (ImageView) v.findViewById(R.id.imageView1); 
      holder.thumbnail = (ImageView) v.findViewById(R.id.image); 
      v.setTag(holder); 
      Log.d(TAG, "Row tag is:" + v.getTag()); 
      holder.favourite.setTag(pos); 



      holder.favourite.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        int posi = (Integer) v.getTag(); 
        //Log.d(TAG, "Cursor total count" + c.getCount() + " position:" + holder.favourite.getTag() + " view position:" + pos + " " + posi); 
        Log.d(TAG,"****************************** INFO REGARDING CLICKING ON FAVOURITE ************************"); 
        Log.d(TAG,"Position of image clicked   : " + posi); 
        temp_cursor.moveToPosition(posi); 
        int id = temp_cursor.getInt(temp_cursor.getColumnIndex("_id")); 
        String markedAsFav = temp_cursor.getString(temp_cursor.getColumnIndex("favourite")); 
        Log.d(TAG, "Id of clicked item is : " + id + "    Favourite : " + markedAsFav); 

        if(markedAsFav.equalsIgnoreCase("no")) { 

         Log.d(TAG, "****In favourite onClick*** Was not as favourite... Mark as favourite..."); 
         holder.favourite.setImageResource(R.drawable.ic_favourite_2); 
         db.updateRowAsFav(id, temp_cursor.getString(temp_cursor.getColumnIndex("favourite"))); 
        } else if(markedAsFav.equalsIgnoreCase("yes")) { 
         Log.d(TAG, "****In favourite onClick*** Was as favourite... Mark it as not favourite..."); 
         holder.favourite.setImageResource(R.drawable.ic_favourite_1); 
         db.updateRowAsFav(id, temp_cursor.getString(temp_cursor.getColumnIndex("favourite"))); 
        } 
       } 
      }); 
     } else { 
      ((EpisodeHolder) v.getTag()).favourite.setTag(pos); 
     } 
     final EpisodeHolder holder = (EpisodeHolder) v.getTag(); 
     this.c.moveToPosition(pos); 
     String imageUrl = this.c.getString(this.c 
       .getColumnIndex("table_epi_image")); 
     String titleStr = this.c.getString(this.c 
       .getColumnIndex("table_epi_title")); 
     String descStr = this.c.getString(this.c 
       .getColumnIndex("table_epi_description")); 

     if(c.getString(c.getColumnIndex("favourite")).equalsIgnoreCase("yes")) 
       { 
      holder.favourite.setImageResource(R.drawable.ic_favourite_2); 
       } 
     else 
     { 
      holder.favourite.setImageResource(R.drawable.ic_favourite_1); 

     } 

     holder.thumbnail.setTag(imageUrl); 
     new DownloadImagesTask().execute(holder.thumbnail); 

     //TextView title = (TextView) v.findViewById(R.id.title); 
     holder.title.setText(titleStr); 

     //TextView desc = (TextView) v.findViewById(R.id.description); 
     holder.desc.setText(descStr); 
     return (v); 
    } 
} 

我知道我失去了一些東西。但我找不到那是什麼。

請幫我解決這個問題。

先謝謝您!

+0

這裏的temporory coursor是一樣的,當它被傳遞給構造函數,因此更新的引用對光標不可用,並且它將轉到先前不是當前的no/yes值,您將不得不用新的值 –

+0

謝謝。如何解決? – Dhasneem

+0

只需再次加載光標 –

回答

0

正如Yume117所說,我已經調用了notifyDataSetChanged()方法。我已經更新了我的回答如下:

我在onclick()

if(markedAsFav.equalsIgnoreCase("no")) { 

         Log.d(TAG, "****In favourite onClick*** Was not as favourite... Mark as favourite..."); 
         holder.favourite.setImageResource(R.drawable.ic_favourite_2); 
         db.updateRowAsFav(id, temp_cursor.getString(temp_cursor.getColumnIndex("favourite"))); 
        } else if(markedAsFav.equalsIgnoreCase("yes")) { 
         Log.d(TAG, "****In favourite onClick*** Was as favourite... Mark it as not favourite..."); 
         holder.favourite.setImageResource(R.drawable.ic_favourite_1); 
         db.updateRowAsFav(id, temp_cursor.getString(temp_cursor.getColumnIndex("favourite"))); 
        } 

refreshCursorAdapter加入這一行refreshCursorAdapter();旁邊,下面的代碼是:

public void refreshCursorAdapter() { 
     // TODO Auto-generated method stub 

     Log.d(TAG,"Refresh adapter is called....***************"); 
     dbAdapter = new DBAdapter(); 
     Cursor cursor = null; 
     try { 
      EpisodeCursorAdapter adapter; 
      dbAdapter.open(); 
      cursor = dbAdapter.fetchLimitRowsFromEpisode(
        Common.currentListCountForEpi, EpisodeActivity.refId); 
      String[] columns = new String[] { DatabaseHelper.SUB_ID, 
        DatabaseHelper.EPI_FILEIMAGE_ID, 
        DatabaseHelper.EPI_TITLE, DatabaseHelper.EPI_DESC }; 

      // the XML defined views which the data will be bound to 
      int[] to = new int[] { R.id.title, R.id.description }; 
      adapter = new EpisodeCursorAdapter(
        EpisodeActivity.context, R.layout.episode_row_view, 
        cursor, columns, to, Common.REFRESH); 

      adapter.changeCursor(cursor); 
      adapter.notifyDataSetChanged(); 

      dbAdapter.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    }