2013-06-09 1 views
0

Люди.Simplecursoradapter с Listview просто перепутали при прокрутке

У меня проблема с моим simplecursorAdapter. Все работает отлично, за исключением того, что при прокрутке списка он просто смешивает значок «Избранное» для строк, включенных в пользовательский макет, и он просто появляется случайно при прокрутке. Можете ли вы указать мне, что не так в моем коде?

Заранее благодарен!

public class AlternateRowCursorAdapter extends SimpleCursorAdapter { 

int layoutn; 
Cursor localCursor, test; 
Bitmap bitImg; 
Context localContext; 
Bitmap Avatar; 
ImageView one, two, three, four, five; 
LayoutInflater mInflater; 
SQLiteDatabase mDb; 
MyDbHelper mHelper; 

public static final String TABLE_NAME = "MSGS"; 
public static final String COL_MsgID = "msgIdc"; 
public static final String COL_MsgCat = "msgCatC"; 
public static final String COL_MsgTit = "msgtitleC"; 
public static final String COL_MsgFavor = "msgFavorC"; 


public AlternateRowCursorAdapter (Context context, int layout, Cursor c, 
     String[] from, int[] to) { 

    super(context, R.layout.listtype, c, from, to); 

    this.localContext = context; 

} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    View row = super.getView(position, convertView, parent); 

    final Cursor cursbbn = getCursor(); 

    if (row == null) 

    { 
     row = ((LayoutInflater) localContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 
       .inflate(R.layout.listtype, null); 

    } 


    final String Title; 
    String SandID; 
    final String MsgID; 
    final String MsgFav; 

    Typeface tf = Typeface.createFromAsset(localContext.getAssets(),"fonts/khalaadsara.ttf"); 

    Title = cursbbn.getString(2); 
    SandID = cursbbn.getString(1); 
    MsgID=cursbbn.getString(0); 
    MsgFav=cursbbn.getString(4); 

    TextView titler = (TextView) row.findViewById(R.id.Sandtit); 

    titler.setTypeface(tf); 
    titler.setText(Title); 



    one = (ImageView) row.findViewById(R.id.imageView5); 
    two = (ImageView) row.findViewById(R.id.imageView4); 
    three = (ImageView) row.findViewById(R.id.ImageView03); 
    four = (ImageView) row.findViewById(R.id.ImageView02); 
    five = (ImageView) row.findViewById(R.id.imageView1); 


    if(MsgFav.contentEquals("YES")) 
    { 
     one.setImageResource(R.drawable.favorpress); 
    } 



    return row; 

} 

}

Edit: Вот мой код для обновления значения в Onresume события:

private void refreshvalues() { 

    mDb = mHelper.getWritableDatabase(); 

    curs = mDb.query(MyDbHelper.TABLE_NAME, columns, null, null, null, 
      null, null, 

      null); 

    cursF = mDb.query(TABLE_NAME, columns, COL_MsgFavor + "=" + "?", 
      new String[] { "YES" }, null, null, COL_MsgTit + " ASC"); 

    String[] headers = new String[] {MyDbHelper.COL_MsgTit ,MyDbHelper.COL_MsgID}; 

    mAdapter = new AlternateRowCursorAdapter(this, R.layout.listtype, curs, 
      headers, new int[] { R.id.Sandtit}); 

    fAdapter = new AlternateRowCursorAdapter(this, R.layout.listtype, 
      cursF, headers, new int[] { R.id.Sandtit }); 

    mList.setAdapter(mAdapter); 
    fList.setAdapter(fAdapter); 

curs.moveToFirst(); 
cursF.moveToFirst(); 

mAdapter.notifyDataSetChanged(); 
fAdapter.notifyDataSetChanged(); 

mList.invalidateViews(); 
fList.invalidateViews(); 

curs.requery(); 
cursF.requery(); 

} 
+0

какие предметы вы пытаетесь отобразить в списке? –

+0

Я просто показываю тестовое название из SQLite DB, и он работает нормально, но я также реализовал кнопку избранного в пользовательском макете, и он меняет свое изображение на приоритет после нажатия пользователем. Всякий раз, когда я просматриваю список, любимый значок начинает беспорядочно отображаться как предпочтительный, хотя его не нажимают. –

+0

if (MsgFav.contentEquals ("YES")) { one.setImageResource (R.drawable.favorpress); } –

ответ

0

ListView перерабатывает элемент списка View s. Поэтому обязательно звоните one.setImageResource().

if (MsgFav.contentEquals("YES")) { 
    one.setImageResource(R.drawable.favorpress); 
} else { 
    one.setImageResource(R.drawable.default_drawable_as_specified_in_layout); 
} 
+0

Спасибо !!! теперь он отлично работает! :) –

+0

Мое единственное беспокойство теперь - когда я нажимаю кнопку избранного в представлении, он просто меняет свое изображение по своему желанию, но когда я перехожу на вкладку «Избранное» в своем списке, он не отображает строки до тех пор, пока я снова не перезапущу действие. Я использую notifyDataSetChanged() для адаптера и invalidateViews() для listviews, но на самом деле это не работает. Я думаю, нам нужно обновлять список, когда пользователь нажимает на вкладку «Список». –

1

Прежде всего, вы подгоняет ListView, которые необходимо реализовать пользовательский адаптер, который проходит любой из SimpleCustomAdapter, ArrayAdapter и BaseAdapter.

Теперь вы перепутали свой список, потому что вы не держите значения в представлениях. Вам нужно написать класс ViewHolder, который содержит ваши представления ListView в том же состоянии, перед тем как прокручиваться. Внутри метода getView() вам нужно реализовать еще часть инструкции if.

Это эффективный способ использования ListView. Проверьте ниже, как это можно реализовать: Например:

Я сделал класс Task, который содержит значение из базы данных:

static class Task { 

     int task_id; 
     String task_brief; 
     String task_priority; 
     String is_completed = "false"; 

     Task(int tmp_task_id, String tmp_task_brief, String tmp_task_priority, 
       String tmp_task_is_completed) { 
      task_id = tmp_task_id; 
      task_brief = tmp_task_brief; 
      task_priority = tmp_task_priority; 
      is_completed = tmp_task_is_completed; 
     } 

     int get_task_id() { 
      return task_id; 
     } 

     String get_task_brief() { 
      return task_brief; 
     } 

     String get_task_priority() { 
      return task_priority; 
     } 

     String get_task_is_completed() { 
      return is_completed; 
     } 

     void set_task_is_completed(String tmp_task_is_completed) { 
      is_completed = tmp_task_is_completed; 
     } 
    } 

Теперь мы создаем класс TaskViewHolder, удерживающий вид:

static class TaskViewHolder { 

     TextView tv_task_brief; 
     ImageView iv_task_is_completed; 

     public TaskViewHolder(TextView tmp_tv_task_brief, 
       ImageView tmp_iv_task_is_completed) { 
      tv_task_brief = tmp_tv_task_brief; 
      iv_task_is_completed = tmp_iv_task_is_completed; 
     } 

     TextView get_tv_task_brief() { 
      return tv_task_brief; 
     } 

     ImageView get_iv_task_is_completed() { 
      return iv_task_is_completed; 
     } 
    } 

И после этого, реализовать собственный адаптер, как показано ниже:

static class TaskAdapter extends ArrayAdapter<Task> { 

     LayoutInflater inflater; 

     public TaskAdapter(Context context, List<Task> tmp_al_task) { 
      super(context, R.layout.single_row_home, 
        R.id.textViewSingleRowHome, tmp_al_task); 
      inflater = LayoutInflater.from(context); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 

      Task task = (Task) this.getItem(position); 

      final ImageView imageView; 
      final TextView textView; 

      if (convertView == null) { 

       convertView = inflater.inflate(R.layout.single_row_home, null); 

       imageView = (ImageView) convertView 
         .findViewById(R.id.imageViewSingleRowHome); 
       textView = (TextView) convertView 
         .findViewById(R.id.textViewSingleRowHome); 

       convertView.setTag(new TaskViewHolder(textView, imageView)); 

      } else { 

       TaskViewHolder viewHolder = (TaskViewHolder) convertView 
         .getTag(); 
       imageView = viewHolder.get_iv_task_is_completed(); 
       textView = viewHolder.get_tv_task_brief(); 
      } 

      imageView.setTag(task); 

      textView.setText(task.get_task_brief()); 
      if(task.get_task_priority().equals("High")) 
       textView.setTextColor(Color.RED); 
      else if(task.get_task_priority().equals("Medium")) 
       textView.setTextColor(Color.GREEN); 
      else 
       textView.setTextColor(Color.BLUE); 

      if (task.get_task_is_completed().equals("true")) { 

       imageView.setImageResource(R.drawable.action_cancel_icon); 
       textView.setPaintFlags(textView.getPaintFlags() 
         | Paint.STRIKE_THRU_TEXT_FLAG); 
      } else { 

       imageView.setImageResource(R.drawable.action_cancel_icon_2); 
       textView.setPaintFlags(textView.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 
      } 

      imageView.setFocusable(false); 
      imageView.setFocusableInTouchMode(false); 
      imageView.setClickable(true); 
      imageView.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View v) { 

        Task task = (Task) imageView.getTag(); 

        if (task.get_task_is_completed().equals("false")) { 


         imageView.setImageResource(R.drawable.action_cancel_icon); 

         ContentValues values = new ContentValues(); 
         values.put("is_completed", "true"); 

         database.update("task_info", values, "task_id=?", 
           new String[] { task.get_task_id() + "" }); 
         values.clear(); 

         textView.setPaintFlags(textView.getPaintFlags() 
           | Paint.STRIKE_THRU_TEXT_FLAG); 

         task.set_task_is_completed("true"); 

        } else { 

         imageView.setImageResource(R.drawable.action_cancel_icon_2); 

         ContentValues values = new ContentValues(); 
         values.put("is_completed", "false"); 

         database.update("task_info", values, "task_id=?", 
           new String[] { task.get_task_id() + "" }); 
         values.clear(); 

         textView.setPaintFlags(textView.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 

         task.set_task_is_completed("false"); 
        } 
       } 
      }); 

      return convertView; 
     } 
    } 

Примечание: Одна важная вещь, если ваш ListView содержит элементы, которые есть мыши события, то, что элементы должны быть установлены в view.setFocusable(false);view.setFocusableInTouchMode(false); и view.setClickable(true);. Нам это нужно, потому что ListView принимает событие щелчка любого вида в виде своего собственного события click. Кроме того, событие клика просмотра должно быть отделено от события Click Click List.

+0

Спасибо Shree за ваш вздор! Я попытаюсь реализовать его таким образом. –

+0

Добро пожаловать. Просто дайте мне знать, если вы закончите с этим. –

+0

Моя единственная забота теперь - когда я нажимаю кнопку избранного в представлении, она просто меняет свое изображение по своему желанию, но когда я перехожу на вкладку избранного в своем списке, она не отображает строки до тех пор, пока я снова не перезапущу действие. Я использую notifyDataSetChanged() для адаптера и invalidateViews() для listviews, но на самом деле это не работает. Я думаю, нам нужно обновлять список, когда пользователь нажимает на вкладку «Список». Какие-нибудь sugesstions? –

 Смежные вопросы

  • Нет связанных вопросов^_^