2014-02-03 3 views
2

После примерно 12 часов работы мне удалось написать рабочий класс cursoradapter с супер быстрым кодом знаменитого Google video, этот класс заполнил список из базы данных, с текстом и рисунком за ряд. Но у меня такое ощущение, что я погубил усилия Google по производительности с кодом, который я добавил в конце класса, чтобы заполнить текст и изображение, и я не могу сказать о производительности, когда плохо использую реальную/конечную базу данных ... (с также курсор выполнен в классе деятельности) Вот 2 подклассы:Android Listview с sqlite и CursorAdapter

public class CursorLi extends CursorAdapter { 
    LayoutInflater minflater; 
    int imd; 

     public CursorLi(Context context, Cursor c, boolean autoRequery) { 
      super(context, c, autoRequery); 
      minflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);  
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent){ 
      ViewHolder holder; 
      if (convertView == null){   
       convertView = minflater.inflate(R.layout.lvitem, parent, false); 
       holder = new ViewHolder(); 
       holder.text = (TextView) convertView.findViewById(R.id.litext); 
       holder.icon = (ImageView) convertView.findViewById(R.id.fiig); 
       convertView.setTag(holder); 
      } else{ 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      c.moveToPosition(position); 
      imd = getResources().getIdentifier(c.getString(6), "drawable", "com.example.myapp"); 
      dr = getResources().getDrawable(imd); 
      holder.text.setText(c.getString(4)); 
      holder.icon.setImageDrawable(dr); 
      return convertView; 
     } 
     @Override 
     public void bindView(View view, Context context, Cursor cursor) {} 
     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { return null; } 
    } 

public static class ViewHolder { 
    TextView text; 
    ImageView icon; 
    } 

Может вы, ребята, мне помочь оптимизировать код, пожалуйста? В частности:

  1. Почему я должен был добавить "c.moveToPosition (положение);" ? Я думал, что cursoradapter управляет положением ...

  2. Есть ли более быстрый способ применить изображение к просмотру изображения строки? Я использовал 3 строки кода (db содержит имя файла pic).

  3. getString - лучший способ?

  4. Было ли лучше отдельный класс или подкласс? Когда класс был отдельным классом, я не знал, как получить данные курсора для funciton getView(), поэтому теперь объявлен его подкласс класса и указатель .

Если вы хотите спросить меня, почему я не использовал simplecursoradapter, потому что я хотел бы использовать код Google, для работы, так как список может иметь 300 строк ... Благодаря

ответ

2
  1. Для CursorAdapter s, вы можете переопределить только newView и bindView вместо getView. Реализация по умолчанию getView в CursorAdapter делает cursor.moveToPosition для вас.
  2. Я не знаю, что вы имеете в виду.
  3. getString в порядке.
  4. Читать 1. Для управления курсорами я рекомендую использовать CursorLoader. (См .: https://developer.android.com/training/load-data-background/setup-loader.html)

Ваш адаптер должен выглядеть следующим образом.

public class CursorLi extends CursorAdapter { 

    private LayoutInflater minflater; 
    private int imd; 

    public CursorLi(Context context, Cursor c, boolean autoRequery) { 
     super(context, c, autoRequery); 
     minflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view = minflater.inflate(R.layout.lvitem, parent, false); 
     ViewHolder holder = new ViewHolder(); 
     holder.text = (TextView) view.findViewById(R.id.litext); 
     holder.icon = (ImageView) view.findViewById(R.id.fiig); 
     view.setTag(holder); 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     imd = getResources().getIdentifier(c.getString(6), "drawable", "com.example.myapp"); 
     dr = getResources().getDrawable(imd); 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(c.getString(4)); 
     holder.icon.setImageDrawable(dr); 
    } 

    public static class ViewHolder { 
     TextView text; 
     ImageView icon; 
    } 

} 
+0

Спасибо. Итак, почему без «c.moveToPosition (позиция)»; , getString не работает? – Jacks23465

+0

По умолчанию реализация 'getView' в' CursorAdapter' делает это для вас (https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/widget/CursorAdapter.java#L247). Если вы (ошибочно) переопределите 'getView', вам нужно сделать это самостоятельно. –

0

, что я сделать следующее:

первый - создать класс Bean, который содержит значения базы данных, как следующее:

public class MyData { 
    private String text ; 
    private String imageName ; 

    // with its getter and setter methods 


} 

второй - когда я запрос к базе данных я получит курсор, я прокручу курсор и задаю значения в объектах MyData в ArrayList, например:

Cursor cursor = database.query(....); 
ArrayList<MyData> list = new ArrayList<MyData>(); 
MyData data = null; 
while(cursor.moveToNext()){ 

data = new MyData() 

data.setText(c.getString(4)); 
data.setImageName(c.getString(6)); 

list.add(data); 

} 



    cursor.close() ; 

return list ; 

3rd- я хотел бы использовать BaseAdapter вместо CursorAdapter, как следующее:

public class MyAdapter extends BaseAdapter { 

    private ArrayList<Mydata> list ; 
    private Activty activty ; 


    public MyAdapter (Activity activty ,ArrayList<MyData> l){ 
     this.activty =activty ; 
     this.list = l ;  

    } 


} 

четвёртую - в методе GetView вы получаете детали из списка, как следующее:

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

     //.... just like you did with your PlaceHolder to initialize the views 

     String text = list.get(position) .getText(); 
     String imageName = list.get(position).getImageName(); 

     // here you your image inside a new thread 

     Thread trd = new Thread(new Runnable(){ 
      @Override 
       public void run(){ 

        try{ 
      final int drawableResource = activty .getApplicationContext().getResources().getIdentifier(imageName , "drawable", "com.example.myapp"); 


        activty .runOnUiThread(new Runnable() { 

        public void run() { 
         imageView.setImageDrawable(drawableResource); 

        } 
       }); 
       } 
       catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 
     trd.run(); 


} 

и, пожалуйста, дайте мне некоторую обратную связь, я написал это в блокноте: P

Надеюсь, что это поможет.

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