2013-12-19 5 views
1

После нескольких попыток получить пользовательский адаптер, я почти там. Теперь у меня остается одна проблема: получить данные в адаптере. Вот что я делаю.Как отправить данные в пользовательский адаптер

У меня есть класс CustomListAdapter для адаптера, класс sqLiteHelper для данных CRUD и класс mainActivity. В mainActivity загрузите такие параметры:

ListView list; 
CustomListAdapter adapter; 
public MainActivity CustomListView = null; 
public ArrayList<Players> CustomListViewValuesArr = new ArrayList<Players>(); 

//button handlers newmatch_players_home 
public void addSpelerNu(View button) { 

    Log.d("WedstrijdID buiten de create", ""+wedstrijdId); 
    Log.d("id return team thuis", ""+thuisTeamId); 
    //thuisteam 
    final EditText shirtNummer = (EditText) findViewById(R.id.shirtThuis); 
    String nummerShirt = shirtNummer.getText().toString(); 
    int shirtSpeler = Integer.parseInt(nummerShirt); 
    final EditText spelerNaam = (EditText) findViewById(R.id.naamThuis); 
    String naamSpeler = spelerNaam.getText().toString(); 

    Integer wedstrijdSpelerId = (int) (long) wedstrijdId; 
    SqLiteHelper db = new SqLiteHelper(this); 
    db.addSpeler(new Players(shirtSpeler, naamSpeler, thuisTeamId, wedstrijdSpelerId)); 
    Log.d("Toevoegen speler THUIS", ">> BEGIN"); 
    Log.d("Toevoegen speler", "Shirt = "+nummerShirt+" Naam = "+naamSpeler +" Team ="+thuisTeamId+" Wedstrijd ="+wedstrijdSpelerId); 
    Log.d("Toevoegen speler", ">> EIND"); 

    shirtNummer.setText(null); 
    spelerNaam.setText(null); 


    CustomListView = this; 

    /******** Take some data in Arraylist (CustomListViewValuesArr) ***********/ 

    ArrayList <Players> CustomListViewValuesArr = new ArrayList<Players>();  

    Resources res =getResources(); 
    list= (ListView)findViewById(R.id.listHome); 

    /**************** Create Custom Adapter *********/ 
    adapter=new CustomListAdapter(CustomListView, CustomListViewValuesArr); 
    list.setAdapter(adapter); 



} 

Это работает, за исключением данных. Данные, которые я хочу использовать в моей sqlitehelper

public ArrayList<Players> getPlayersForTeam(int teamNumber,int matchNumber) { 
     ArrayList<Players> speler = new ArrayList<Players>(); 

     String query = "SELECT * FROM " + TABLE_SPELERS + " WHERE team=? AND wedstrijd =?"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     String[] selectionArgs = new String[] { Integer.toString(teamNumber), Integer.toString(matchNumber) }; 
     Cursor cursor = db.rawQuery(query, selectionArgs); 

     Players spelers = null; 
     if (cursor.moveToFirst()) { 
      do { 
      spelers = new Players(); 
      spelers.setIdSpeler(Integer.parseInt(cursor.getString(0))); 
      spelers.setShirt(Integer.parseInt(cursor.getString(1))); 
      spelers.setSpeler(cursor.getString(2)); 
      spelers.setTeam(Integer.parseInt(cursor.getString(3))); 
      spelers.setSpelerWedstrijd(Integer.parseInt(cursor.getString(4))); 


       speler.add(spelers); 
      } while (cursor.moveToNext()); 
     } 


     Log.d("Alle spelers in DB for team:" + teamNumber, speler.toString()); 

     // return wedstrijden 
     return speler; 
    } 

Если я загружаю эти данные как этот

List <Players> list = new ArrayList<Players>(); 
list=db.getPlayersForTeam(thuisTeamId,wedstrijdSpelerId);  

Я вижу log.d в LogCat. Но я просто не могу получить эти данные в своем CustomListViewValuesArr.

Что мне делать?

Это customListAdapter класс

package com.jd.wedstrijdkaart; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

public class CustomListAdapter extends BaseAdapter { 

      /*********** Declare Used Variables *********/ 
      private Activity activity; 
      private ArrayList data; 
      private static LayoutInflater inflater=null; 
      Players tempValues=null; 
      int i=0; 

      /************* CustomAdapter Constructor 
      * @return *****************/ 
      public CustomListAdapter(Activity a, ArrayList d) { 

        /********** Take passed values **********/ 
        activity = a; 
        data=d; 

        /*********** Layout inflator to call external xml layout() ***********/ 
         inflater = (LayoutInflater)activity. 
                getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      } 

      /******** What is the size of Passed Arraylist Size ************/ 
      public int getCount() { 

       if(data.size()<=0) 
        return 1; 
       return data.size(); 
      } 

      public Object getItem(int position) { 
       return position; 
      } 

      public long getItemId(int position) { 
       return position; 
      } 

      /********* Create a holder Class to contain inflated xml file elements *********/ 
      public static class ViewHolder{ 

       public TextView shirt; 
       public TextView name; 

      } 

      /****** Depends upon data size called for each row , Create each ListView row *****/ 
      public View getView(int position, View convertView, ViewGroup parent) { 

       View vi = convertView; 
       ViewHolder holder; 

       if(convertView==null){ 

        /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
        vi = inflater.inflate(R.layout.adapter_players, null); 

        /****** View Holder Object to contain tabitem.xml file elements ******/ 

        holder = new ViewHolder(); 
        holder.shirt = (TextView) vi.findViewById(R.id.shirt); 
        holder.name=(TextView)vi.findViewById(R.id.name); 

        /************ Set holder with LayoutInflater ************/ 
        vi.setTag(holder); 
       } 
       else 
        holder=(ViewHolder)vi.getTag(); 

       if(data.size()<=0) 
       { 
        holder.name.setText("No Data"); 

       } 
       else 
       { 
        /***** Get each Model object from Arraylist ********/ 
        tempValues = null; 
        tempValues = (Players) data.get(position); 

        /************ Set Model values in Holder elements ***********/ 

         holder.shirt.setText(tempValues.getShirt()); 
         holder.name.setText(tempValues.getSpeler()); 



       } 
       return vi; 
      } 


     } 
+0

можете ли вы отправить весь addSpelerNu способ или лучше всего класс активности – Gooziec

+0

сделано.Я использую addSpelerNu как событие onClick для кнопки –

+0

, так как я вижу, что вы просто передаете пустой массив в конструкторе адаптера – Gooziec

ответ

0

Как правило, при создании пользовательских адаптеров вы хотите передать свой ArrayList в конструктор для вашего CustomListAdapter. Это относительно прямолинейно.

// Create a reference to your custom adapter as a Class Member and arraylist 
CustomListAdapter mAdapter = null; 
ArrayList<MyObjects> mArrayList = null; 


// Initialize the adapter somewhere in onCreate 
// After you have retrieved the data out of sql and created your custom object 


mArrayList = new ArrayList<MyObjects>(); 
// Fill your array list with data 

// ******* THIS IS WHERE YOU WANT TO RETRIEVE THE ITEM FROM SQLITE 

// Then Each time your get a new cursor object 
// You should create a new MyObject object and add it to the ArrayList 

// Intialize the custom list adapter using the context, and your array list 
mAdpater = new CustomListAdapter(getBaseContext(), mArrayList); 


// Set ListView adapter 
listView.setAdapter(mAdapter); 

Затем Создайте специальный адаптер и использовать конструктор для передачи данных

// Custom Adapter Class 

public class CustomListAdapter extends BaseAdapter { 


private ArrayList<MyObjects> mObjects = null; 
private LayoutInflater mInflater = null; 

    // Private class to hold information about the row content UI Items 
private class RowContent{ 
    // Reference the UI Widgets for each row 
     TextView mTextView; 
     // etc. 
} 

// Constructor 
public CustomListAdapter(Context context, ArrayList<MyObject> objects){ 
    this.mInflater = LayoutInflater.from(context); 
    this.mObjects = objects; 

} 


// -------------------------------------------------- 
// BaseAdapter Overrides 
// -------------------------------------------------- 
    // Returns the count of your arrayList 
@Override 
public int getCount() { 
    int count = 0; 

    if(mObjects!=null && mObjects.length() >= 1){ 

     count = mObjects.length(); 

    } 

    return count; 
} 
    // Returns object at position 
@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return mOjbects[position]; 
} 
    // returns position 
@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 
    // This is where all the magic happens 
    // Creates a new row for each item in your arraylist 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    RowContent theRow; 

    // If ConvertVIew is null 
    if(convertView == null){ 
     // Create a reference to the class holding the UI Elements 
     theRow= new RowContent(); 
     // set the view using your XML layout for a custom list item 
     convertView = mInflater.inflate(R.layout.custom_list_item, null); 
     // reference the UI widgets in the XML by their ID's    
     theRow.mTextView = (TextView) convertView.findViewById(R.id.textView); 
     // set the Tag for the View   
     convertView.setTag(theRow); 

    }else{ 
        // If there is already an item, recycle it 
     theRow= (RowContent) convertView.getTag(); 
    } 

    // Set the Text or arrays For UI Widgets 
    theRow.mtextView.setText(mObjects.get(position).text); 

      // return the view 
    return convertView; 
} 

}

1

В onCreate() вы это делаете:

ArrayList <Players> CustomListViewValuesArr = new ArrayList<Players>(); 
... 
adapter=new CustomListAdapter(CustomListView, CustomListViewValuesArr); 

Вы инициализации адаптера с пустым списком предметов (CustomListViewValuesArr пуст).

У вас есть 2 варианта:

  1. Вы можете получить данные из базы данных и передать его к адаптеру при его инициализации.

  2. Вы можете инициализировать адаптер пустым массивом, а затем передать данные на адаптер. Для этого вам нужно будет предоставить метод настройки в адаптере, например:

    public void setData (ArrayList d) { data = d; // Сообщите представлениям, что данные были изменены, чтобы они могли обновить notifyDataSetChanged(); }

1
public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

совершенно неправильно. Здесь вы должны вернуть объекты в указанной позиции в ArrayList.

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