I have made a simple contact apps and now I wish to add tab view to this app. I am following the tutorial here. Below is part of the source code for my MainActivity.jave:
public class MainActivity extends ListActivity {
private ListView contactListView;
private CursorAdapter contactListViewAdapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
contactListView = getListView(); // get ListView id
contactListView.setOnItemClickListener(viewContactListListener);
String[] from = new String[] { "familyName" }; // built an String array
// named "from"
int[] to = new int[] { R.id.contactTextView };
contactListViewAdapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.contact_list_item, null, from, to);
setListAdapter(contactListViewAdapter); // set adapter
}
I tried to change "public class MainActivity extends ListActivity" to "public class MainActivity extends TabActivity implements OnTabChangeListener{". However, I get the error "The method getListView() is undefined for the type MainActivity" and other similar errors. I need suggestions on how to fix this. Thanks for any help.
ListActivity provides some help methods to manage ListView so if you want to change your parent activity from ListActivity to TabActivity you need to handle ListActivity behaviour yourself.
Basically you need to get and store somewhere the ListView object. Something like mListView = (ListView) findViewById(android.R.id.list) on your onCreate method and then implement missing method
ListView getListView()
{
return mListView;
}
Also setting your adapter will be a bit different. Instead of calling setListAdapter(contactListViewAdapter); // set adapter there should be contactListView.setAdapter(contactListViewAdapter);
Related
public class Main2Activity extends AppCompatActivity {
ListView simpleList;
String[] thoughtList = {" "};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent intent = getIntent();
String newThought = intent.getStringExtra(MainActivity.EXTRA_TEXT);
thoughtList.add(newThought); //error comes herer hich wont allow add
simpleList = (ListView)findViewById(R.id.simpleListView);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
simpleList.setAdapter(arrayAdapter);
}
}
that is my code on second page it brings over varible (saved as newThought) from the previous activity which i then want to add to thoughtList to display in ListView but won't let me add the new varible to the list. does my code need tweaking or should i start again to achieve varible brougth over from previous activity to add into list view on activity 2
Have you tried using an ArrayList instead of an string array?
String array has a fixed size when array list does not.
That may be your problem.
Here is my code, when i use
List<String> array = new ArrayList<String>();
array.add("kk");
array.add("bb");
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
listView1.setAdapter(adapter);
This will work fine in my onCreate method, but the problem is I can't us 'this' in an anonynmous class. replacing 'this' with getApplicationContext() does not work for some reason, either inside or outside the onCreate.
like this
ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,array);
Can anyone help me find the issue I have searched a lot but can not find an answer on this anywhere
Thanks
I would pass the this-pointer via parameter in the constructor of the inner class and save it in a inner class field, like this ->
public class outerclass{
#Override
protected void onCreate(Bundle savedInstanceState){
//.. other stuff
innerclass ic = new innerclass(this);
//.. other stuff
}
public class innerclass{
private Context c;
public innerclass(Context c){
this.c = c;
}
}
}
When you use an adapter to add something into a list or an array, you need to alert the list, in this case array, that there was a change. After you call the add function, you need to call adapter.notifyDataSetChanged()
Also, when declaring the adapter, declare it outside of onCreate() then assign your values inside onCreate()
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems);
See below:
public class MainActivity extends AppCompatActivity {
// List of array strings that will represent list items
public static ArrayList<String> listItems = new ArrayList<String>();
// Array string will handle the information stored in the listview
public static ArrayAdapter<String> adapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lView = (ListView) findViewById(R.id.list);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
lView.setAdapter(adapter);
}
}
Then you can call:
listItems.add(<value>);
adapter.notifyDataSetChanged();
Then if need be you also have access to:
listItems.clear(); and adapter.clear();
Hope this helps!
I assume your anonymous class is inside your MainActivity. If this is the case you can simply do:
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array);
When you use "this" inside your anonymous class, it refers to the anonymous inner class instance and not the instance of the outer class.
I am curious how I would go about adding an an editText variable to a list in another activity. I have created an arrayList that names are stored into as they are entered in the editText line. These are stored in the nameList variable in the class StartingActivity. How would i go about adding and showing these names into a ListView in another activity and class called ListActivity as shown. Thank you. Also, how do i refractor the names of classes and files without it just basically not making my program runable.
Code:
Class StartingActivity:
public void onClick_btnConfirm {
EditText editName = (EditText) findViewById(R.id.editName);
TextView textOutput = (TextView) findViewById(R.id.textOutput);
Intent intentList = new Intent(StartingActivity.this, ListActivity.class);
if(editName.length()!=0) {
nameList.add(editName.getText().toString());
editName.setText("");
}
//intentList.putExtra("Name", editName.toString());
startActivity(intentList);
}
Class ListActivity:
public class ListActivity extends ActionBarActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
ListView listView = (ListView) findViewById(R.id.listAthletes);
final StartingActivity nameList = new StartingActivity();
nameList.getNameList();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nameList.getNameList());
listView.setAdapter(arrayAdapter);
arrayAdapter.notifyDataSetChanged();
}
}
You cannot run findviewbyid() for an id in another Activity.This answer might be of help to you. If that is not what you really want to go with, you can do two things:
Send Intents with the string.
Use a sharedPreference and write the string to a sharedPreference. SharedPreferences also have an OnChangeListener, so you will be able know if the preference has changed. In the onResume() of that activity , you can just read from the sharedPreference, and update the UI
Also take a look at AsyncTask here
As mentioned , you can also use the SQLite Database
In my ListActivity I have three different options that are clickable. In my "row.xml" I have place an ImageView, but am not sure how to implement it into my Activity so that each selectable item has a different image. Would it be another Adapter?
Here is my ListActivity
public class StreamCasts extends ListActivity {
private static final String[] items={ "item1", "item2", "item3"
};
public void onCreate(Bundle icicle){
super.onCreate(icicle);
setContentView(R.layout.heroselect);
setListAdapter(new ArrayAdapter<String>(this,
R.layout.row, R.id.label,
items));
}
You'll need to create a custom ArrayAdapter that lets you customize the view returned on the overrided getView.
Take a look at http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ but a general search for 'custom arrayadapter' will give you the start of this.
Get used to it as this is a very common pattern with complicated listviews.
I have following code:
public class ShowActivity extends ListActivity implements OnItemClickListener {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.show_list);
ListView lv = getListView();
String[] projection = new String[]{
BaseColumns._ID,
DepotTableMetaData.ITEM_NAME,
DepotTableMetaData.ITEM_AMOUNT,
DepotTableMetaData.ITEM_UNIT,
DepotTableMetaData.ITEM_PPU,
DepotTableMetaData.ITEM_TOTAL,
DepotTableMetaData.ITEM_COMMENT};
Cursor c = managedQuery(ContentProviderMetaData.DepotTableMetaData.CONTENT_URI, projection, null, null, ContentProviderMetaData.DepotTableMetaData.DEFAULT_SORT_ORDER);
String[] columns = new String[]{BaseColumns._ID,ContentProviderMetaData.DepotTableMetaData.ITEM_NAME, ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT, ContentProviderMetaData.DepotTableMetaData.ITEM_UNIT, ContentProviderMetaData.DepotTableMetaData.ITEM_PPU, ContentProviderMetaData.DepotTableMetaData.ITEM_TOTAL, ContentProviderMetaData.DepotTableMetaData.ITEM_COMMENT};
int[] to = new int[]{R.id.lname,R.id.lamount,R.id.lunit,R.id.lppu,R.id.ltotal,R.id.lcomment};
Log.d("ShowActivity","Cursor, columns, to set - now setting adapter");
SimpleCursorAdapter simpleadapter = new SimpleCursorAdapter(this,R.layout.list_entry, c, columns, to);
// ListView lv = (ListView)findViewById(R.id.ListView);
this.setListAdapter(simpleadapter);
lv.setOnItemClickListener(this);
// intentCheck();
}
It works fine, but as you might have seen at my comments, i don't want to create the listview via getListView(), i want to do a usual setContentView(R.Layout.---) and populate a Listview, which is defined there. But all tutorials I have seen yet do it like that, and I have no clue how to change that to my wishes.
How does my layout-xml have to look like? how do i "tell him to use it" ?
Thanks in advance.
You can use directly setContentView(R.layout.main); on a ListActivity as long as you define a listView with the android:list id on your xml:
<ListView android:id="#+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
To set the adapter call directly setListAdapter from your ListActivity
Don't use ListActivity as your base class, extend Activity, set your content to the layout, grab a reference to your expanded ListView (findViewById(...)) and then handle setting the adapter that way.
ListView lv = (ListView)findViewById(android.R.id.list);
No change needed in the .xml