mercredi 26 août 2015

ListView With BaseAdapter

I am learning BaseAdapter. I have custom listview. I want to fill data in listview from database. I am getting error of Null Pointer. Here is my code.

DbTools.java

public class DbTools extends SQLiteOpenHelper {

    public DbTools(Context context) {
         super(context, "local.db", null, 1);

}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table ashu(Name varchar, address varchar)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("Drop Table if Exists ashu");
    onCreate(db);
}

public void InsertDb(String Name,String address) {

    SQLiteDatabase db = getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put("Name", Name);
    cv.put("address", address);
    db.insert("ashu", null, cv);
    db.close();
}

public ArrayList<NameAddress> getAllData(){
    ArrayList<NameAddress> dataFromDb = new ArrayList<NameAddress>();
    String SQL = "Select Name, address from ashu";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(SQL, null);
    if (cursor.moveToFirst()){
        do{
            NameAddress na = new NameAddress();
            na.NamesDb = cursor.getString(0).toString();
            na.AddressDb = cursor.getString(1).toString();
            dataFromDb.add(na);             
        } while(cursor.moveToNext());
    }
    return dataFromDb;

   }
}

This is my Adapter class in which I extended BaseAdapter

Adapter.java

public class Adapter extends BaseAdapter{

 public ArrayList<NameAddress> result;
ListView lv;
private Context context;
DbTools dbTools = new DbTools(context);
private LayoutInflater inflater = null;


public Adapter(Context context,ArrayList<NameAddress> rslt){
    rslt=result;
    this.context=context;
    inflater =  (LayoutInflater)(this.context).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


@Override
public int getCount() {     
    return result.size();
}

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

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

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

    final NameAddress tmpData = result.get(position);
    Holder h = new Holder();
    DbTools dbTools = new DbTools(context);

    View rootView;
    rootView = inflater.inflate(R.layout.row, null);
    h.textView1 = (TextView) rootView.findViewById(R.id.mainText);
    h.textView2 = (TextView) rootView.findViewById(R.id.subText);
    h.textView1.setText(tmpData.NamesDb);
    h.textView2.setText(tmpData.AddressDb);

    return rootView;
}

class Holder{   
    public TextView textView1, textView2;
}
}

MainActivity.java

public class MainActivity extends Activity {

ListView mainList;
Button save;
EditText name,address;
DbTools dbTools = new DbTools(this);
ArrayList<NameAddress> addList;
private Adapter adpter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainList = (ListView)findViewById(R.id.mainList);
    save = (Button)findViewById(R.id.button1);
    name = (EditText)findViewById(R.id.nameEditText);
    address = (EditText)findViewById(R.id.addressEditText);

    save.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            String tempName = name.getText().toString();
            String tempAdd = address.getText().toString();
            dbTools.InsertDb(tempName, tempAdd);

            Toast.makeText(getApplicationContext(), "Added Successfully", Toast.LENGTH_SHORT).show();
            name.setText("");
            address.setText("");

        }
    });

    addList = new ArrayList<NameAddress>();
    addList = dbTools.getAllData();
    adpter = new Adapter(this, addList);
    adpter.notifyDataSetChanged();
    mainList.setAdapter(adpter);

}
}

And I have model class

NameAddress.java

public class NameAddress {
  String NamesDb;
  String AddressDb;
}

And In my row.xml there are only two textviews

activity_main.xml

<LinearLayout xmlns:android="http://ift.tt/nIICcg"
xmlns:tools="http://ift.tt/LrGmb4"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.ashu.customlist.MainActivity" >

<EditText
    android:id="@+id/nameEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/name"
    android:ems="10" android:inputType="text">

    <requestFocus />
</EditText>

<EditText
    android:id="@+id/addressEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/address"
    android:ems="10" />

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/save" />

<ListView
    android:id="@+id/mainList"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>
</LinearLayout>

Aucun commentaire:

Enregistrer un commentaire